在对 CNN 进行基准测试时,我发现大部分时间都花在了全连接层上。但是在计算计算复杂度时,我发现:
O(conv) = N*(D * (W+P) * (H+P) * h *w)/S
O(fully_connected) = D*W*H*N
在哪里
D = Dimensions Input
W,w = Width Input, width Filter
H, h = Height Input, height Filter
S = Stride
P = Padding
N = number of outputs
例如,我有一个
1024x11x11 feature map input DxWxH
, 一个 5x5 filter h,w
无填充 p
, 和 Stride S of 1
,以及 number of outputs N shall be 512
这导致卷积的以下计算:
O(conv) = 512*(1024*11*11*5*5)/1 = 1 585 971 200
如果相同的输入用于全连接层,并且所需的输出仍然是 512,那么:
O(fully_connected) = 512*1024*11*11 = 63 438 848
这是因为在 GPU 上并行卷积层的更先进的方法和 conv 层有更多的操作但更少的计算时间导致了并行问题?还是我计算每一层复杂度的方法完全错误?
最佳答案
您可以通过将全连接连接转换为等效卷积来检查它是否只是实现。对于每个全连接层,都有一个等效的卷积层(参见 my question 了解详细信息和示例)。
c
大小 channel w × h
(因此形状为 c × w × h
),然后是带有 n
的全连接层节点。 (c ⋅ w ⋅ h) × 1 × 1
. n
的卷积层尺寸过滤器 1 × 1
. 现在检查时间。如果它比全连接层更快,那仅仅是因为卷积的实现更好。
关于neural-network - 为什么尽管其复杂性低于卷积层,但在全连接层上花费的时间最多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093428/