- 0. 前言
- 1. 减少计算量
- 2. 引入更多非线性
- 3. BottleNeck结构
在构建卷积神经网络时,我们该挑选多大尺寸的卷积核呢?如VGG16等很多网络结构都选用了大量的3x3卷积核和1x1卷积核,为什么要选用尺寸较小的卷积核呢,为什么不用5x5,7x7或者更大的卷积核呢?
根据我目前的理解,这主要可以从两个方面来解释:
(1) 多层小卷积核堆叠可以和大卷积核有一样的感受野,但小卷积核的参数和计算量更少;(更经济)
(2)多层小卷积核堆叠相较于大卷积核可以引入更多的非线性。(效果更好)
下面就从这两个方面来解释。
1. 减少计算量我们先来思考卷积核的尺寸大小有什么影响:卷积核尺寸不同,对应在输入图像(输入的feature map)上的感受野大小不同(卷积核和感受野尺寸一样)。在进行卷积 *** 作时,就是感受野在原图上每次滑动一个stride。
举个例子:输入图像尺寸为5 x 5,经过两层卷积核大小为3 x 3的卷积 *** 作,则在没有padding的情况下,经过第一层3 x 3卷积 *** 作后输出3 x 3的feature map,再经过第二层的3 x 3 *** 作后最后输出的是1 x 1的feature map。即:经过两层3 x 3卷积 *** 作,输出的feature map中的每个元素可以看到原图上5 x 5的范围。如下图所示(下图是补充padding的情况,padding=1,stride=1):
当然,如果只用一层卷积层,卷积核大小为5x5,最后输出的feature map也是1 x 1,即:经过一层5 x 5卷积后得到的feature map中每个元素也可以看到原图中5 x 5的范围。
也就是说:多层小卷积核的堆叠可以达到和单层大卷积核一样的感受范围
接下来我们再来分析二者参数量上的区别:
假设输入图像的尺寸为H x W x C(长H,宽W,C个channel),3 x 3卷积核和5 x 5卷积核都为F个,使用padding使得每次输出的feature map size都为H x W。
当使用一层5x5卷积核时:
参数量为:C x 5 x 5 x F = 25CF
当使用两层 3 x 3卷积核时(和一层5 x 5卷积核有一样大的感受范围):
参数量为:(C x 3 x 3 x F) x 2 = 18CF
显然,使用两层3x3卷积核使用的参数量要小于一层5 x 5卷积核。
参数量的差别直接导致了计算量的差别,卷积 *** 作的计算量主要是感受野中的元素和卷积核中的对应元素相乘,最后相加。因此,卷积核中有多少个元素,就需要进行多少次相乘的 *** 作。输出的feature map中每个元素都是经过感受野和卷积核中对应元素相乘再相加中得到的。
当使用一层5x5卷积核时:计算量为(H x W) x (C x 5 x 5 x F) = 25HWCF
解释下计算过程:因为输出的feature map大小为H x W,而每个元素都是由感受野和卷积核对应元素相乘再相加得到的(这步 *** 作需要进行5x5xC次乘法),共有F个卷积核,因此对于输出的feature map的每个元素,共由5x5xCxF次乘法。因为输出的feature map共H x W个元素(padding保证输入输出图像大小均为H x W),因此共需要(H x W) x (C x 5 x 5 x F) = 25HWCF次乘法。
同理,当使用两层3x3卷积时,计算量为:(H x W) x (C x 3 x 3 x F) x 2 = 18HWCF
综上,多层小卷积核堆叠可以和大卷积核有一样的感受野,但小卷积核的参数和计算量更少
2. 引入更多非线性为什么现在绝大多数神经网络都是“深度神经网络”,而非“宽度神经网络”呢?根据研究只有一层隐含层的神经网络足以拟合任意函数,那为什么不把神经网络做得浅而宽呢?
在我看来,这其中的一个原因是:网络加深可以引入更多的“非线性”。神经网络的激活函数可以带来“非线性”。使用多层卷积网络就可以多次使用激活函数,从而引入更多的非线性。
因此,多层小卷积核堆叠相较于大卷积核可以引入更多的非线性。(效果更好)
3. BottleNeck结构在卷积网络中经常要用到1 x 1卷积进行升维或降维,我们上面说两层3 x 3卷积相较于一层5 x 5卷积有更少的参数量,那我们能否进一步使用1 x 1的卷积来减少参数量呢?实际是可以的,我们可以使用BottleNeck来实现,所谓bottleneck实际就是先使用1x1卷积对输入的feature map
进行降维,再用更大的卷积核进行特征提取(如3x3卷积核),再使用1x1卷积进行升维。这个过程中虽然引入了1x1卷积核的参数,但经过一开始的降维,大大减少了输入feature map的参数量,所以总参数量还是减少的。我们可以从下面的图中看出:
我们来计算下,没有使用bottleneck的参数量为:(3 x 3) x C x C = 9C2(这里是有C个3x3卷积核)
而使用了bottleneck后参数量为:(C x 1 x 1 x C/2) + (C/2 x 3 x 3 x C/2) + (C/2 x 1 x 1 x C) = 3.25C2
可以看出参数量减少了近1/3,还是很可观的。ResNet中对于较深的网络(ResNet50/101/152)就使用了bottleneck结构,以减少参数量。想了解ResNet可以参考我的这篇博客:【ResNet】ResNet论文学习笔记
END:)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)