在做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(转)= 512 *(1024 * 11 * 11 * 5 * 5)/ 1 = 1 585 971 200
如果相同的输入用于完全连接的层,并且所需的输出仍然是512,那么:
O(完全连接)= 512 * 1024 * 11 * 11 = 63 438 848
这是因为更高级的方法可以在GPU上对卷积层进行并行处理,并且转换层有更多的操作,但是由于平行问题导致的计算时间减少了吗?或者我计算每个层的复杂性的方法是错误的?
答案 0 :(得分:3)
您可以通过将完全连接的连接转换为等效卷积来检查它是否只是实现。对于每个完全连接的层,都有一个等效的卷积层(有关详细信息和示例,请参阅my question)。
c
个大小为w × h
的频道(因此形状为c × w × h
),后跟一个带有n
个节点的完全连接的图层。(c ⋅ w ⋅ h) × 1 × 1
。n
的{{1}}过滤器添加卷积图层。现在检查时间。如果它比完全连接的层快,那么它只是由于更好的卷积实现。