当前位置:   article > 正文

如何理解卷积神经网络中的1*1卷积

1*1卷积

我们都知道,卷积核的作用在于特征的抽取,越是大的卷积核尺寸就意味着更大的感受野,当然随之而来的是更多的参数。早在1998年,LeCun大神发布的LetNet-5模型中就会出,图像空域内具有局部相关性,卷积的过程是对局部相关性的一种抽取。

但是在学习卷积神经网络的过程中,我们常常会看到一股清流般的存在—1*1的卷积!

比如在残差网络的直连里:
这里写图片描述

残差网络的Bootleneck残差模块里:
这里写图片描述

在GoogleNet的Inception模块里:

这里写图片描述

都有1*1卷积核的出现,那么它到底是做什么的?我们应该如何理解1*1卷积的原理?

当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的核),这就是因为参数的权值共享

一般的卷积运算可以压缩输入的长度和宽度,1*1卷积核可以整合各个数据通道信息缩小数据尺寸的深度,同时减小计算量

卷积核参数计算:卷积核的长度*卷积核的宽度*卷积核的个数

卷积计算量计算:输出数据大小*卷积核的尺寸*输入通道数

比如(懒得绘图)求输入28*28*192经过5*5*32的卷积核输出为28*28*32的参数大小和运算量大小

① 参数计算:5*5*32

② 运算量计算:(28*28*32)*(5*5)*(192)≈1.2亿

那么1*1卷积核是怎么通过压缩通道信息来减少计算量的呢?

我们把上面你那个例子改一下在中间添加以一个1*1的卷积核

28*28*192先通过一个1*1*16卷积核得到28*28*16的大小然后再经过5*5*32的卷积核得到28*28*32的输出,那么输入输出都和前面那个例子是一样的,只是中间多了一个1*1的卷积核。我们来计算一下现在的计算量

① (28*28*16)*(1*1)*(192)≈2.4M

②(28*28*32)*(5*5)*(16)≈10.0M

所以total computational cost ≈1240万和1.2亿相比

看到了吧,就是添加了一个1*1的卷积核就大大降低计算量的哦,同时应该注意添加了1*1产生的“bottleneck layer”的意思

下面介绍1*1的卷积核与googlenet里面的Inception。
正式介绍之前,首先回顾卷积网络的基本概念。

  1. 卷积核:可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸。卷积核的个数就对应输出的通道数,这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数。
  2. 池化(pooling):卷积特征往往对应某个局部的特征。要得到globa的特征需要将全局的特征就行一个aggregation。池化就是这样一个操作,对于每个卷积通道,将更大尺寸(甚至是globa)上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling当然就对应了cross region。与1x1的卷积相对应,后者可以看作一个cross channel的pooling操作。pooling的另外一个作用就是升维或者降维,后面我们可以看到1x1的卷积也有相似的作用。

下面从一般卷积过程介绍1x1的卷积,借用[1]中的图来表示卷积的过程:
convolution
对于nxn(n>1)的卷积核,我们通常还要考虑pad(边缘补0的个数),stride(每次卷积移动的步长)。但是当尺寸是1x1时,对于single channel而言就相当于对原特征的scala操作;但是我们一般遇到的都是multi-channel的情况,此时我们便可以根据自己的需要定义卷积核的个数,从而进行降(升)维。如上面所说,如果将它看作cross channel的pooling 操作,它还能帮我们得到在同一位置不同通道之间进行特征的aggregation。
总结一下,1x1的卷积核可以进行降维或者升维,也就是通过控制卷积核(通道数)实现,这个可以帮助减少模型参数,也可以对不同特征进行尺寸的归一化;同时也可以用于不同channel上特征的融合。一个trick就是在降维的时候考虑结合传统的降维方式,如PCA的特征向量实现,这样效果也可以得到保证。
以googlenet[3]中的inception模块为例,来说明1x1的卷积如何来减少模型参数。
inception
左边是naive的inception模块,右边是加入1x1 convolution进行降维的inception。按照上面的说法,我们的这层的模型参数与输入的特征维数(28x28x192),卷积核大小以及卷积通道数(包括三种卷积核,分别是1x1x64,3x3x128,5x5x32),右图中在3x3,5x5 convolution前新加入的1x1的卷积核为96和16通道的,在max pooling后加入的1x1卷积为32通道。那么图a该层的参数为(1x1x192x64)+(3x3x192x128)+(5x5x192x32)
图b该层的参数为(1x1x192x64)+(1x1x192x96)+(1x1x192x16)+(3x3x96x128)+(5x5x16x32)+(1x1x192x32).
比较可知,模型参数减少了。
reference
[1]http://blog.csdn.net/stdcoutzyx/article/details/41596663
[2]http://www.caffecn.cn/?/question/136
[3]going deeper with convolutions

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/92524
推荐阅读
  

闽ICP备14008679号