1*1卷积过滤器 和 正常的过滤器一样,唯一不同的是它的大小是1*1,没有考虑在前一层局部信息之间的关系。最早大神颜水成论文《Network In Network》 中使用1*1卷积 ,目的是想加深加宽网络结构 。后来谷歌GoogleNet的Inception网络( Going Deeper with Convolutions ),微软亚洲研究院(MSRA)在 ResNet中的残差模块等中使用。
如果卷积的输出输入都只是一个平面,那么1x1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系。 但卷积的输出输入是长方体,所以1x1卷积实际上是对每个像素点在不同的channels上进行线性组合(信息整合),且保留了图片的原有平面结构,调控depth,从而完成升维或降维的功能。。
卷积神经网络CNN 中用1*1 卷积的作用
- 降维(减少参数)
Inception模块
原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。
以GoogLeNet的3a模块为例
输入的feature map是28×28×192,
1×1卷积通道为64
3×3卷积通道为128
5×5卷积通道为32
左图结构,那么卷积核参数为:192 × (1×1×64) +192 × (3×3×128) + 192 × (5×5×32) = 387072
右图对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)= 157184 看,参数大约减少到原来的三分之一。
同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量(feature map尺寸指W、H是共享权值的sliding window,feature map 的数量就是channels)
GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)。
2. 升维(用最少的参数拓宽网络channal)
微软的深度残差网络ResNet中的残差模块为例(152层ResNet架构,除了在层数上面创纪录,ResNet 的错误率也低得惊人,达到了3.6%,人类都大约在5%~10%的水平。这是目前为止最好的深度学习框架)
图2.普通shortcut和深度瓶颈结构对比
上图中,在输入处有一个1*1卷积核,在输出处也有一个卷积核,3*3,64的卷积核的channel是64,只需3*3卷积层后添加一个1*1,256的卷积核,只用64*256个参数就能把网络 channel 从 64 拓宽四倍到 256。
假定上一层的feature map是w*h*256,并且最后要输出的是256个channel。
左图中结构的操作数:w*h*256*3*3*256 =589824*w*h
左图中结构侧操作数:w*h*256 * 1*1*64 + w*h*64 * 3*3*64 +w*h*64 * 1*1*256 = 69632*w*h,,右图参数大概是左图参数八分之一(实现降维,减少参数)。
因此,通过合理使用1*1卷积核可以用最少的参数拓宽网络channal。
3. 提升模型的表征能力
卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励( non-linear activation ),增加模型深度,一定程度上提升模型的表征能力;
4. 实现全连接
《network in network 》提出可以用 1*1的卷积层 代替 全连接层 。
卷积层就相当于一个卷积核,对于传送过来的feature map进行局部窗口滑动,无论你输入的feature map多大(不能小于卷积核的大小),都不会对卷积造成影响,而全连接使用的是图像的全局信息。
全连接层的坏处就在于其会破坏图像的空间结构,因此人们便开始用卷积层来“代替”全连接层,通常采用1×1的卷积核,这种不包含全连接的CNN成为全卷积神经网络(Fully Convolutional Networks, FCN),FCN最初是用于图像分割任务,之后开始在计算机视觉领域的各种问题上得到应用,事实上,Faster R-CNN中用来生成候选窗口的CNN就是一个FCN。FCN的特点就在于输入和输出都是二维的图像,并且输入和输出具有相对应的空间结构,在这种情况下,我们可以将FCN的输出看作是一张热度图,用热度来指示待检测的目标的位置和覆盖的区域。在目标所处的区域内显示较高的热度,而在背景区域显示较低的热度,这也可以看成是对图像上的每一个像素点都进行了分类,这个点是否位于待检测的目标上。
在FCN网络中,我们通过卷积替换掉全连接,具体做法是:
- 在第一个FC处,使用400个5*5*16的卷积核对上一层layer进行处理,得到的输出是1*1*400。这样,输出中每一个值都包含了一个5*5*16的卷积核。
- 在第二个FC处,使用400个1*1*400的卷积核对上一层的输出1*1*400进行处理,得到的还是1*1*400。
- 对应于softmax输出,这里依然用1*1卷积进行输出,n个1*1*400的卷积核
参考:
360建人工智能研究院院长颜水成论文《Network In Network》
谷歌GoogleNet的Inception网络( Going Deeper with Convolutions )
微软亚洲研究院(MSRA) 深度残差网络 ResNet