https://zhuanlan.zhihu.com/p/145566635
1*1卷积核
如果卷积的输出输入都只是一个平面, 那么1*1卷积核并没有什么意义, 它是完全不考虑像素与周边其他像素关系. 但卷积的输出输入是长方形, 所以**1x1卷积实际上是对每个像素点, 在不同的channels上进行线性组合(信息整合), 并保留了图片的原有平面结构, 调控depth, 从而完成升维或降维的功能.
1x1卷积核的作用
1x1卷积的作用可以总结为以下三点:
- 可以实现信息的跨通道整合和交互
- 具有降维和升维的能力, 减少网络参数. 这里的维度指的是卷积核通道数(厚度), 而不改变图片的宽和高.
- 在保持feature map尺寸不变(即不损失分辨率)的前提下大幅增加非线性特性, 即可以把网络做得很deep, 也可以提升网络的表达能力
跨通道信息交互(channels)
例子: 使用1x1卷积核, 实现降维和升维的操作其实就是channel间信息的线性组合变化, 3x3,64channels的卷积核后面添加一个1x1,28channels的卷积核,就变成了3x3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。
注意: 只是在channel维度上做线性组合,W和H上是共享权值的sliding window
降维/升维
在卷积神经网络中,channels 的含义一般是指每个卷积层中卷积核的数量。
1×1卷积核并不会改变 height 和 width,改变通道的第一个最直观的结果,就是可以将原本的数据量进行增加或者减少。这里通常都称之为升维、降维。而且改变的只是 height × width × channels 中的 channels 这一个维度的大小而已。
这里我们以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,
而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了:1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。
同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,(feature map尺寸指W、H是共享权值的sliding window,feature map 的数量就是channels)
左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。
而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)
增加非线性
在CNN里的卷积大都是多通道的feature map和多通道的卷积核之间的操作(输入的多通道的feature map和一组卷积核做卷积求和得到一个输出的feature map),如果使用1x1的卷积核,这个操作实现的就是多个feature map的线性组合,可以实现feature map在通道个数上的变化。
备注:一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuro。