前言
这是卷积神经网络学习路线的第三篇,这一篇开始盘点一下池化层的不同类型和1*1卷积的作用。
池化层的不同类型
池化通常也被称为下采样(Downsampling),一般是用在卷积层之后,通过池化来降低卷积层输出特征图的维度,有效减少网络参数的同时还可以防止过拟合现象。池化有用的原因我们在卷积神经网络学习路线(一)中讨论过,推文地址为:点这里,当时说池化层实际上真正起作用的地方在于他的非线性映射能力和可以保持一定量的平移不变性的能力。这个能力是因为在一个图像区域有用的特征很有可能在另一个区域同样有用。因此,为了描述一个大分辨率的图像特征,一个直观的方法就是对大分辨率图像中的不同位置的特征进行聚合统计。具体来说,常见池化的方法有以下几种:
- 标准池化
- 重叠池化
- 空间金字塔池化
接下来我们就仔细介绍一下每种池化。
标准池化
通常包括最大池化(MaxPooling)和平均池化(Mean Pooling)。以最大池化为例,池化核尺寸为 2 × 2 2\times 2 2×2,池化步长为 2 2 2,可以看到特征图中的每一个像素点只会参与一次特征提取工作。这个过程可以用下图表示:
重叠池化
操作和标准池化相同,但唯一不同地方在于滑动步长 s t r i d e stride stride小于池化核的尺寸 k k k,可以想象到这样的话特征图中的某些区域会参与到多次特征提取工作,最后得到的特征表达能力更强。这个过程可以表示为下图:
空间金字塔池化
这种池化是在进行多尺度训练的时候,第一次看到这种操作的时候是读目标检测算法之Fast RCNN算法的时候。对不同输出尺度采用不同的滑窗大小和步长以确保输出尺度相同
(
w
i
n
s
i
z
e
=
⌈
i
n
o
u
t
⌉
;
s
t
r
i
d
e
=
⌊
i
n
o
u
t
⌋
;
)
(win_{size}=\lceil \frac{in}{out}\rceil; stride=\lfloor \frac{in}{out}\rfloor; )
(winsize=⌈outin⌉;stride=⌊outin⌋;),同时用如金字塔式叠加的多种池化尺度组合,以提取更加丰富的图像特征。常用于多尺度训练和目标检测中的区域提议网络(Region Proposal Network)的兴趣区域(Region of Interest)提取。空间金字塔池化可以用下图表示:
1*1卷积的作用
我最开始接触到
1
×
1
1\times 1
1×1卷积应该是在阅读经典论文GoogleNet的时候,当然我说的是我第一次接触,并不代表GoogleNet(包含了InceptionV1-V4)是第一个使用
1
×
1
1\times 1
1×1卷积的。在InceptionV1网络中,Inception模块长下面这样:
可以看到这个Inception模块中,由于每一层网络采用了更多的卷积核,大大增加了模型的参数量。这时候为了减少模型参数量,在每一个较大卷积核的卷积层前引入
1
×
1
1\times1
1×1卷积,将宽高和通道方向的卷积进行了分离。修改后的Inception模块表示为下图:
这样就实现了在不影响模型的特征表达能力条件下大大减少了模型的参数量。我们定量计算一下上下两个Inception模块的参数量,假设输入
C
1
C_1
C1输出
C
2
C_2
C2通道数都是
16
16
16,则原始的Inception模块的参数量是:
(
1
×
1
+
3
×
3
+
5
×
5
+
0
)
×
C
1
×
C
1
=
8960
(1\times1+3\times3+5\times5+0)\times C_1\times C_1=8960
(1×1+3×3+5×5+0)×C1×C1=8960,而使用了1*1卷积的Inception模块的参数量为:
(
1
×
1
×
(
3
C
1
+
C
2
)
+
3
×
3
×
C
2
+
5
×
5
×
C
2
)
×
C
1
=
5248
(1\times1\times (3C_1+C_2)+3\times3\times C_2 +5\times5\times C_2)\times C_1=5248
(1×1×(3C1+C2)+3×3×C2+5×5×C2)×C1=5248,可以看到计算量减少了接近一半。
因此, 1 × 1 1\times 1 1×1卷积的作用可以总结为可以实现信息的通道整合和交互,以及具有升维/降维的能力。
卷积核是否越大越好?
这是本文的最后一个问题,显然这个问题我们肯定会回答否。但你是否真的认真思考过其中的原因?
在早期的一些经典网络中如Lenet-5和AlexNet,用到了一些大的卷积核例如
11
×
11
11\times 11
11×11,
5
×
5
5\times 5
5×5,受限于当时的计算资源,无法将网络堆叠得很深,因此需要将卷积核设得比较大以获得更大的感受野。但这种大卷积核导致计算量大幅增加,训练过程缓慢,更不利于训练深层模型。后来VGGNet,GoogleNet时代发现通过堆叠
2
2
2个
3
×
3
3\times 3
3×3卷积核可以获得和
5
×
5
5\times 5
5×5卷积核相同的感受野,同时参数量也会减少,如
2
×
3
×
3
<
5
×
5
2\times 3\times 3 < 5\times 5
2×3×3<5×5。因此,
3
×
3
3\times 3
3×3卷积核被广泛应用在许多卷积神经网络中。所以基本可以认为在大多数情况下通过堆叠较小的卷积核比直接采用单个更大的卷积核更加有效并且能获得计算资源节约。因此我们可以认为,CV领域小卷积核堆叠是好于大卷积核的。
那么是不是其他领域也是这样呢?并不是。在NLP领域,由于文本内容不像图像数据一样可以对特征进行很深层的抽象,因此该领域的特征提取网络都是比较浅的。这个时候为了获得较大的感受野,就需要使用大的卷积核。因此,我们可以认为在NLP领域大卷积是好于小卷积核的。
总结一下,卷积核是否越大越好呢?这个要具体问题具体分析,在不同的领域大卷积核和小卷积核分别能取得不错的效果。并且在设置卷积核的时候一个常识是不能设得过大也不能过小, 1 × 1 1\times 1 1×1卷积只适合做分离卷积任务而不能对输入的原始特征做有效的特征抽取,而极大的卷积核通常会组合过多无用的特征浪费大量的计算资源。
后记
这篇就讲到这里了,这个系列的下一篇文章,我们来研究研究转置卷积中的棋盘效应,希望这个系列的文章对你有所帮助。
欢迎关注我的微信公众号GiantPandaCV,期待和你一起交流机器学习,深度学习,图像算法,优化技术,比赛及日常生活等。