1×1卷积的作用 NiN模型中的1×1卷积

1*1的卷积

  原来看面经的时候经常看到这么个问题,问的是关于1*1卷积的好处和特点之类的。1*1的卷积,顾名思义就是用大小为1*1的卷积核去做卷积,但也仅仅是长宽为1,卷积核的通道数不做限制。

  通过1*1的卷积,每次只看一个像素点里多个通道的信息,不会识别一个通道里面的其他空间信息。因此1*1卷积侧重于融合一个像素点里3个通道(假如通道是3)的信息,对同一个像素点的不同通道值进行加权求和。

  经常有讲解说“可以把1*1的卷积看作全连接层”。这个如何理解呢?

  如图,假设输入图像宽w高h,那么一共有w*h个像素点,每个像素点又有3个通道。我们可以把它看成w*h个维度为3的向量——这就等价于一个行数为w*h,列数为3的矩阵。

  此时假如说我们要得到通道数为2的output,则我们就需要2个卷积核,每个卷积核通道数当然也要为3,所以此时这两个卷积核也可以形成一个2*3的矩阵。(卷积核长宽都是1就省略了)

  而我们得到的结果,也可以看作是行数为w*h,列数为2的矩阵

  观察输入输出以及卷积核的维度变化,是不是就有矩阵乘法内味了?这就特别地像全连接层~~~但是它与全连接的不同之处在于,全连接的每一个参数各自独立,而这里每个像素点下的n个通道是有着一定权值共享的(用共同的卷积核)。

  所以1*1的卷积核,既可以充当是卷积,也可以看作是另一种意义上的全连接。

    

       此外,特别简单地,使用1*1的卷积核的另一个特点在于它不会改变尺寸大小,但可以很方便地实现通道数的变化,控制卷积核的个数就可以达到这一目的。

NiN(Network in Network)网络中的1*1卷积

  之前提到过AlexNet,VGG等网络,都是在经过一些列卷积池化操作过后将结果打平(flatten),送入全连接层,最终将结果映射到结果数目的维度上。但是在这种做法下,当将flatten后的卷积结果连接到全连接层时,会带来很大的参数量。(比如AlexNet和VGG全连接层的第一个隐层都是4096个神经元,再乘上自己flatten后的维度(也是几千,比如VGG打平后的维度为512*7*7),这么一乘后参数量可达到百万级别。参数量过大一方面会占用内存和计算资源,另一方面也容易带来过拟合。

  NiN在此基础上提出了用1*1卷积层来代替全连接层。整个NiN是由若干个NiN块组成的(这种由重复的小结构组成大结构的例子非常多,比如还有Resnet之类的)。每个NiN块组成为:普通卷积—>1*1的卷积—>1*1的卷积。我们用了1*1的卷积来充当全连接层的效果(1*1卷积核stride=1,padding=0)。只不过这里是对每一个像素(这个像素可能有很多通道)使用了相同的权重进行了全连接,这点在上面讨论1*1卷积的意义时讲了。

  那么,整体的NiN网络就是使用NiN块和3*3、stride=2的最大池化层进行交替连接。全局没有任何一个地方直接使用全连接层。那么,NiN是如何拟合到目标结果的呢?

  在全连接中,假如我们是10分类任务,我们可以置最后一个输出层神经元个数为10。而在NiN中,因为没有全连接层,使用的是全局平均池化层(AdaptiveAvgPool2d)具体操作是这样的:比如我们要做10分类任务,那么最后一个NiN块的输出通道数我们要设置为10,然后通过这么一个全局平均池化AdaptiveAvgPool2d(1,1),每个通道我们都会变成1*1的大小,因为有10个通道,我们就相当于得到了一个10维的向量,最后送入softmax去处理即可。

  整个NiN相比于带全连接层的卷积神经网络,通过1*1卷积减少了参数和计算量,也不容易过拟合。效果上也会好一丢丢~

  1*1卷积也被广泛应用于其他很多模型当中,以后再提到的时候就不会陌生了。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JunanP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值