10.6 1乘1卷积和全局平均池化层

1023.png 在我们上一节的例子里,我们发现在整个卷积神经网络里参数量最大的是全连接层。它的参数量是800x64,其中800是因为每个特征图由25个特征,一共32个通道,25x32=800。作为一个全连接层它在整个网路参数里占据了过大的比重,今天我们就来学习两种方法,1乘1卷积和全局平均池化层,利用它们都可以降低全连接层的参数。

10.6.1 1乘1卷积

1乘1卷积初听起来好像没什么用,因为对于图像,多要通过多个像素相互对比才能表达信息。如果只有一个像素,它表达不了任何信息。 1024.png 比如对于上图左边的特征图,经过一个1x1的卷积核,weight为2,经过计算就是对每个位置的特征放大2倍。看起来没什么用。这是因为这个例子里的输入通道是1,但实际上1x1卷积是用在多通道上的。

比如对于一个4x4x4的输入特征图,用一个1x1的卷积核进行卷积操作: 1025.png

如下图所示,比如对输入特征图每个通道的左上角特征进行1x1卷积操作,就等于对每个通道左上角特征进行了一个全连接操作: 1026.png

通过上图可以看到1x1卷积可以看成是一个全连接的神经元,它通过共享参数对多个通道相同位置的特征进行融合,线性回归计算,并通过激活函数,产生新的特征。所以它有融合特征,获取新特征的能力。1x1卷积不会加Padding,步长为1,生成的特征图尺寸和输入特征图一致。

1x1卷积最重要的作用是改变特征图的通道数。如果输入特征图的维度为W,H,C1,定义C2个1x1卷积Filter,就可以生成维度为W,H,C2的特征图了。

比如上一节例子中,卷积层最后的输出为5x5x32。如果我们定义4个1x1的卷积Filter,那么就可以生成一个5x5x4的特征图。这个特征图接全连接层的话,全连接层的参数就为:100x64,全连接层的参数量就只有原来的八分之一了。

一般1x1卷积只会用到网络深层,对已经通过普通卷积提取的特征进行融合,不会直接用在原始图片像素上。

10.6.2 全局平均池化层

全局平均池化(Global Average Pooling, GAP)是一种特殊的池化操作,它对每个通道的整个空间维度进行平均运算,将 W×H×C 的特征图压缩为 1×1×C。例如,对一张大小为 5×5×32 的特征图使用全局平均池化,最终会得到一个 1×1×32 的输出。并且它不会额外引入参数。对于上一节的例子,如果我们对卷积最后的特征图先进行全局平均池化,再接全连接层,那么全连接层的参数量就是32×64,大小是原来的25分之一。

10.6.3 两者配合使用

在实际中,有一种更高级的用法,那就是1乘1卷积配合全局平均池化层一起使用。 还是以上一节对手写数字分类的例子,最后卷积层输出的特征图大小为5×5×32,先经过10个1×1卷积,将特征图调整为5×5×10。这里之所以调整通道数为10,是因为我们最终要分的类别数是10。然后对5×5×10的特征图接GAP,得到1×1×10,最后接Flatten,再接softmax,直接对数字0-9进行分类。

1027.png

可以看到,通过1乘1卷积和全局平均池化层,可以完全省去全连接层。大大减少模型参数。

10.6.4 去掉全连接层的好处

在卷积神经网络里去掉全连接层的好处除了上边所说的减少参数量外,还有一个非常好的特性,就是输入可以是任意大小的图片了。下边我们来详细解释。

假如输入图片是一个6×6×1的灰度图片,经过一个3×3的卷积操作,padding为1,stride为1,输出特征还是6×6×1。如果后边我要接一个全连接层,输入就是36,输出为8。那么这个全连接层的参数就是36×8。因为全连接层的参数需要定义网络时就给定,所以它就反向固定了输入图像的尺寸必须为6×6。 假如我们现在有一个7×7×1的输入图片,卷积操作对图像大小没有要求,因为不论图片多大,它都工作在3x3的区域上。图片大,就多计算几次。经过卷积操作后,输出特征还是7×7×1,这时就没有办法接全连接层了,因为这时输入成了49了。而我们定义的全连接层的输入是36。

同样1×1卷积操作和GAP操作都对图像尺寸没有限定,所以去掉全连接层的卷积神经网络更加灵活。

results matching ""

    No results matching ""