为什么全连接层花费的时间最多,尽管其复杂性低于转换层?

Why is the most time spent in the fully connected layers despite its complexity is less than the conv-layers?

在对 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,wp,还有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 上并行化卷积层的方法更先进,并且卷积层具有更多操作但计算时间更少导致并行问题?还是我计算每一层复杂度的方法完全错误?

您可以通过将 fully-connected 连接转换为等效卷积来检查它是否只是实现。对于每个完全连接的层,都有一个等效的卷积层(有关详细信息和示例,请参见 my question)。

  1. 您有 c 个大小为 w × h 的通道(因此形状为 c × w × h),后跟具有 n 个节点的 fully-connected 层。
  2. 在通道之后添加一个整形层以获得(c ⋅ w ⋅ h) × 1 × 1
  3. 添加一个卷积层 n 个大小为 1 × 1 的过滤器。

现在查看时间。如果它比全连接层更快,那只是因为更好地实现了卷积。