0.引言
研究 GoogLeNet 和 VGG 神经网络结构的时候,都看见了它们在某些层有采取 1x1 作为卷积核,在最开始看到的AlexNet中都是出现了卷积核是 3x3和5×5的。那么,1x1 的卷积核有什么意义呢?
最初应用 1x1 卷积核的神经网络是 Network In Network,然后 GoogLeNet 和 VGG 也不约而同的更正了。
他们在论文中解释,大概有下面 2 个意义。
1、增加网络的深度,添加非线性
其一:
这个就比较好理解了,1x1 的卷积核虽小,但也是卷积核,加 1 层卷积,网络深度自然会增加。
其实问题往下挖掘,应该是增加网络深度有什么好处?为什么非要用 1x1 来增加深度呢?其它的不可以吗?
其实,这涉及到感受野的问题,我们知道卷积核越大,它生成的 featuremap 上单个节点的感受野就越大,随着网络深度的增加,越靠后的 featuremap 上的节点感受野也越大。因此特征也越来越形象,也就是更能看清这个特征是个什么东西。层数越浅,就越不知道这个提取的特征到底是个什么东西。
解释:
好比以上这个图,当层数越浅时,我们只能看到low level parts 也就是一些细节的纹理,并不知道这个纹理是来自于车轮,车身,还是其他哪里。但是随着网络层数的加深,感受野增大,到了mid level parts时,就可以看到车的一部分零件了,比如看到了车轮,车窗,但是看不完。到了层数很深后,就是high level parts了,可以看到这个物品是个完整的车子,或者是其他一个什么东西。
其二:
但有的时候,我们想在不增加感受野的情况下,让网络加深,为的就是引入更多的非线性。而 1x1 卷积核,恰巧可以办到。
我们知道,卷积后生成图片的尺寸受卷积核的大小和卷积核个数影响,但如果卷积核是 1x1 ,个数也是 1,那么生成后的图像长宽不变,厚度为1。
但通常一个卷积层是包含激活和池化的。也就是多了激活函数,比如 Sigmoid 和 Relu。
所以,在输入不发生尺寸的变化下,加入卷积层的同时引入了更多的非线性,这将增强神经网络的表达能力。
2、升维或者降维
大家可以看下面这张图:
在这里插入图片描述
我们可以直观地感受到卷积过程中:卷积后的的 featuremap 通道数是与卷积核的个数相同的
所以,如果输入图片通道是 3,卷积核的数量是 6 ,那么生成的 feature map 通道就是 6,这就是升维,如果卷积核的数量是 1,那么生成的 feature map 只有 1 个通道,这就是降维度。
值得注意的是,所有尺寸的卷积核都可以达到这样的目的。
3、减少网络参数,是成倍数减少
那为什么要用 1x1 呢?
原因就是数据量的大小,我们知道在训练的时候,卷积核里面的值就是要训练的权重。下面举1个例子:
在RestNet中:
看右图,输入是一个3×3×256的特征,第一个步骤用64个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复到256个channel,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用1×1卷积的话参考左图,输入假设是3x3x256(图中是3x3x64我们为了对比右图参数个数所以改变一下),第一步经过256个卷积核3×3×256,第二部再经过256个卷积核3×3×256。所以参数数目: 3x3x256x256x2 = 1179648,参数个数差了16.94倍。
减少参数的例子还出现在哪里呢?我们看VGG
Q1: 为什么3个3x3的卷积可以代替7x7的卷积?
2个3×3卷积核叠加可以当做1个5×5卷积核,3个3×3卷积核叠加可以当做1个7×7卷积核。但是大的卷积核拆成3×3叠加之后可以进一步减少参数个数,但是实际的感受野不会发生改变。
下图中 最底下是5×5的,用3×3的去卷积得到3×3的图(也就是第二层),再用3×3的去卷积,就会得到一个数,也就是下图最顶层。
既然,感受野的大小是一样的,那么用 3x3 有什么好处呢?
答案有 2,一是参数更少,二是层数加深了。
现在解释参数变少的问题。(为什么是C^2还是感觉有问题,我理解就是C)
假设现在有 3 层 3x3 卷积核堆叠的卷积层,卷积核的通道是 C 个,那么它的参数总数是 3x(3Cx3C) = 27C^2。同样和它感受野大小一样的一个卷积层,卷积核是 7x7 的尺寸,通道也是 C 个,那么它的参数总数就是 49C^2。通过计算很容易得出结论,3x3 卷积方案的参数数量比 7x7 方案少了 81% 多,并且它的层级还加深了。
4.再换一种理解方式
当1*1卷积出现时,在大多数情况下它作用是升/降特征的维度,这里的维度指的是通道数(厚度),而不改变图片的宽和高。
举个例子,比如某次卷积之后的结果是W*H*6的特征,现在需要用1*1的卷积核将其降维成W*H*5,即6个通道变成5个通道:
如下图就是一个W*H*6的特征,而1*1的卷积核在图上标出,卷积核自身的厚度也是6(图画的好难看!!)
这里写图片描述
通过一次卷积操作,W*H*6将变为W*H*1,这样的话,使用5个1*1的卷积核,显然可以卷积出5个W*H*1,再做通道的串接操作,就实现了W*H*5。
在这里先计算一下参数数量,5个卷积核,每个卷积核的尺寸是1*1*6,也就是一种有30个参数。
我们还可以用另一种角度去理解1*1卷积,可以把它看成是一种全连接,如下图:
这里写图片描述
第一层有6个神经元,分别是a1—a6,通过全连接之后变成5个,分别是b1—b5,第一层的六个神经元要和后面五个实现全连接,本图中只画了a1—a6连接到b1的示意,可以看到,在全连接层b1其实是前面6个神经元的加权和,权对应的就是w1—w6,到这里就很清晰了:
第一层的6个神经元其实就相当于输入特征里面那个通道数:6,而第二层的5个神经元相当于1*1卷积之后的新的特征通道数:5。
w1—w6是一个卷积核的权系数,如何要计算b2—b5,显然还需要4个同样尺寸的核。
最后一个问题,图像的一层相比于神经元还是有区别的,这在于是一个2D矩阵还是一个数字,但是即便是一个2D矩阵的话也还是只需要一个参数(1*1的核),这就是因为参数的权值共享。就是说一个卷积核的参数可以对整张图片进行卷积一遍。
参考文献:
https://blog.csdn.net/briblue/article/details/83151475
https://blog.csdn.net/chaipp0607/article/details/60868689