为什么全连接层花费的时间最多,尽管其复杂性低于转换层?
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,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 上并行化卷积层的方法更先进,并且卷积层具有更多操作但计算时间更少导致并行问题?还是我计算每一层复杂度的方法完全错误?
您可以通过将 fully-connected 连接转换为等效卷积来检查它是否只是实现。对于每个完全连接的层,都有一个等效的卷积层(有关详细信息和示例,请参见 my question)。
- 您有
c
个大小为 w × h
的通道(因此形状为 c × w × h
),后跟具有 n
个节点的 fully-connected 层。
- 在通道之后添加一个整形层以获得
(c ⋅ w ⋅ h) × 1 × 1
。
- 添加一个卷积层
n
个大小为 1 × 1
的过滤器。
现在查看时间。如果它比全连接层更快,那只是因为更好地实现了卷积。
在对 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 上并行化卷积层的方法更先进,并且卷积层具有更多操作但计算时间更少导致并行问题?还是我计算每一层复杂度的方法完全错误?
您可以通过将 fully-connected 连接转换为等效卷积来检查它是否只是实现。对于每个完全连接的层,都有一个等效的卷积层(有关详细信息和示例,请参见 my question)。
- 您有
c
个大小为w × h
的通道(因此形状为c × w × h
),后跟具有n
个节点的 fully-connected 层。 - 在通道之后添加一个整形层以获得
(c ⋅ w ⋅ h) × 1 × 1
。 - 添加一个卷积层
n
个大小为1 × 1
的过滤器。
现在查看时间。如果它比全连接层更快,那只是因为更好地实现了卷积。