深度学习 1*1 卷积的使用

        在卷积神经 网络的开源框架中,一般每层的数据和权重都使用四维的张量的表示。一个四维张量的形状是(N*C*H*W)或(N*H*W*C),其中N是批处理的大小,因为一般训练模型都是采用批量数据;C是特征通道数目,H*W是特征图的高和宽。

      通道内特征和通道间特征:在卷积神经网络中,下一层网络的神经元同时融合了上一层特征通道中对应空间位置的神经元及其邻接位置元的信息,以及不同特征通道对应空间位置的神经元信息。

目录

1)1*1卷积怎么做

 2)为什么用1*1卷积

3)举例说明

1.Inception结构

a)GoogLeNet之Inception结构的解读

 b)GoogLeNet结构的解读

 2.ResNet模块中的1*1卷积的使用

4)总结

1)1*1卷积怎么做

      当1*1卷积出现时,在大多数情况下它作用是升/降特征的维度,这里的维度指的是通道数(厚度),而不改变图片的宽和高。,比如下图所示,某次卷积之后的结果是W*H*3的特征,现在需要用1*1的卷积核将其降维成W*H*2,即3个通道变成2个通道:或者某次卷积之后的结果是W*H*3的特征,现在需要用1*1的卷积核将其升维成W*H*4,即3个通道变成4个通道:

     通过一次卷积操作,W*H*6将变为W*H*5,这样的话,使用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的核),这就是因为参数的权值共享

 2)为什么用1*1卷积

1,灵活的控制特征图的深度;

2,减少参数

       降维,其实也是减少了参数,因为特征图少了,参数也自然跟着就减少,相当于在特征图的通道数上进行卷积,压缩特征图;

3,二次提取特征,使得新特征图的特征表达更佳

4,  现了跨通道的信息组合,并增加了非线性特征
      使用1*1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,实现了通道间的信息交互。因为1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep,增加非线性特性。

3)举例说明

1.Inception结构

       在GoogleNet的Inception3a模块中,假设输入特征图的大小是28*28*192,1x1卷积通道为64,3x3卷积通道为128,5x5卷积通道为32,如下图所示:

preview

左边的卷积核参数计算如下:
192 × (1×1×64) +192 × (3×3×128) + 192 × (5×5×32) = 387072
而右图的3x3卷积层前加入通道数为96的1x1的卷积,5x5的特征图后面加入通道数为16的1x1的卷积,参数的计算如下:
192 × (1×1×64) +(192×1×1×96+ 96 × 3×3×128)+(192×1×1×16+16×5×5×32)= 157184

上述途中的结构是经典的Inception结构,对该结构进行详细的说明

a)GoogLeNet之Inception结构的解读

      Inception结构,是一种高效表达特征的稀疏性结构。基于底层的相关性高的单元,通常会聚集在图像的局部区域(通常CNN底层卷积提取的都是局部特征),这就相当于在单个局部区域上,去学习它的特征,然后在高层用1*1卷积代替这个区域,当然某些相关性可能是隔得比较远的,通过使用大的卷积核学习即可。
原始Inception A结构如下图所示:

 在InceptionA中33,5*5卷积仍然会导致参数量过大,对此问题进行改进,改进的inceptionB结构为:

Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。
(1)采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
(2)之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
(3)文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
(4)网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。

       Factorizing Convolutions with Large Filter Size,也就是分解大的卷积,用小的卷积核替换大的卷积核,因为大尺寸的卷积核可以带来更大的感受野,但也意味着更多的参数,比如5x5卷积核参数是3x3卷积核的25/9=2.78倍。因此可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,(保持感受野范围的同时又减少了参数量),也就产生了Inception V2;而nxn的卷积核又可以通过1xn卷积后接nx1卷积来替代,也就是Inception V3结构,但是作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好。(对于mxm大小的feature map,建议m在12到20之间).

如下图:从左到右是Inception V1~IncVeption V3,需要指出的是将7*7卷积拆成1x7卷积和7x1卷积,比拆成3个3x3卷积更节约参数。

preview

 b)GoogLeNet结构的解读

在这里插入图片描述

      在GoogLeNet中第三层为inception module,采用不同尺度的卷积核来处理问题。第二层到第三层的四个分支分别为:
(1)64个1x1的卷积核,进行ReLU计算后得到28X28X64
(2)96个1X1的卷积核作为3x3卷积核之前的reduce,变成28x28x96,进行ReLU计算后,在进行128个3x3的卷积,pad为1,变为28x28x128.
(3)16个1x1的卷积核作为5x5卷积核之前的reduce,变为28x28x96,进行ReLU计算后,在进行32个5x5的卷积,pad为2,变为28x28x32.
(4)pool层,3x3的卷积核,pad为1,输出为28x28x192,进行32个1x1的卷积,变为28x28x32。
最后将四个结果进行拼接,输出为28x28x256
以下为整个googlenet的参数表

 2.ResNet模块中的1*1卷积的使用

 在ResNet模块中,假设输入的特征图的维度是w*h*256,并且最后要输出的也是256个特征图,如下图所示:

preview

左边的计算如下:
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
结果相差大概8.5倍。

4)总结

1*1的卷积在模型设计中已经成为一个非常标准的组件,通过1*1的卷积的升维和降维可以通过设计灵活的瓶颈结构提高参数的利用率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值