我们在ResNet
深层结构以及Inception
中都见过1x1
卷积层,或者说bottleneck layer
,为什么我们会需要1x1
的卷积核呢?
总的来说1x1
卷积可以用作升降维度、减少参数量和计算量、增加非线性特征的作用。
升降维
如上图所示,feature_map
经过1x1
卷积后尺度不变,意味着它保存了空间信息。
同时,输入feature_map
有64个,经过32个1x1
卷积之后,只有32个了。从这个角度来看,1x1
卷积可以用来做降维处理。反之,则可以用来做升维处理。
减少参数量、计算量
在CS231n中有关GoogLeNet
的内容中,讲到Inception v1
的结构。其和naive inception
最大的不同就在于其灵活运用了1x1
卷积层。
前面所说的降维,其实也是减少了参数量、计算量,因为特征图少了,参数也自然跟着就减少,相当于在特征图的通道数上进行卷积,压缩特征图,二次提取特征,使得新特征图的特征表达更佳。
这个结构存在什么问题呢?就如下图所示,这个结构需要的计算量是非常大的。我们可以来计算一下。(假设我们这里做的卷积都加上了相应的zero-padding
,保持尺寸,也便于后续concat
)。以3x3
卷积为例:输入feature_map
的深度为256,大小为28x28
,经过192个3x3
的卷积,对于单个卷积核而言,它需要滑过所有256个feature_map
,需要计算28x28x256x3x3
次运算,共192个核,所以结果再乘上192,就得到28x28x256x3x3x192
。最后concat
到一起,需要854M
的计算量,相当大了。
那引入1x1
卷积之后呢,同样的方式,我们计算得到下图:
计算量从854M
降到了358M
。
增加非线性特征
为什么inception
结构采用不同大小的卷积核,其实不同大小的卷积核就意味着不同大小的感受野,可以感受到更多的信息,最后拼接意味着不同尺度特征的融合。
回到最开始的那幅降维的图。
> 原来的64个channels就可以理解为跨通道线性组合变成了32channels,这就是通道间的信息交互。因为1x1
卷积核,可以在保持feature map
尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep,增加非线性特性。