我们在ResNet深层结构以及Inception中都见过1x1卷积层,或者说bottleneck layer,为什么我们会需要1x1的卷积核呢?
总的来说1x1卷积可以用作升降维度、减少参数量和计算量、增加非线性特征的作用。

升降维

Conv1x1
如上图所示,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,增加非线性特性。

References

CS231n
知乎