卷积神经网络的结构、尺寸

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络的结构、尺寸相关的知识,希望对你有一定的参考价值。

参考技术A

(摘录源于: CS231n课程笔记 )

最常见的形式就是将一些卷积层和ReLU层放在一起,其后紧跟池化层,然后重复如此直到图像在空间上被缩小到一个足够小的尺寸,在某个地方过渡成全连接层也较为常见。最后的全连接层得到输出,比如分类评分等。
换句话说,最常见的卷积神经网络结构如下:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
其中*指的是重复次数,POOL?指的是一个可选的汇聚层。其中N >=0,通常N<=3,M>=0,K>=0,通常K<3。例如,下面是一些常见的网络结构规律:

输入层(包含图像的)应该能被2整除很多次。常用数字包括32(比如CIFAR-10),64,96(比如STL-10)或224(比如ImageNet卷积神经网络),384和512。

最常用的设置是用用2x2感受野,步长为1。

———·———·———·———·———·———·———·———·———·———·——
(以下)直接全复制,供查阅参考。
———·———·———·———·———·———·———·———·———·———·——

下面是卷积神经网络领域中比较有名的几种结构:

VGGNet的细节: 我们进一步对 VGGNet 的细节进行分析学习。整个VGGNet中的卷积层都是以步长为1进行3x3的卷积,使用了1的零填充,汇聚层都是以步长为2进行了2x2的最大值汇聚。可以写出处理过程中每一步数据体尺寸的变化,然后对数据尺寸和整体权重的数量进行查看:

注意,大部分的内存和计算时间都被前面的卷积层占用,大部分的参数都用在后面的全连接层,这在卷积神经网络中是比较常见的。在这个例子中,全部参数有140M,但第一个全连接层就包含了100M的参数。

一旦对于所有这些数值的数量有了一个大略估计(包含激活数据,梯度和各种杂项),数量应该转化为以GB为计量单位。把这个值乘以4,得到原始的字节数(因为每个浮点数占用4个字节,如果是双精度浮点数那就是占用8个字节),然后多次除以1024分别得到占用内存的KB,MB,最后是GB计量。如果你的网络工作得不好,一个常用的方法是降低批尺寸(batch size),因为绝大多数的内存都是被激活数据消耗掉了。

CNN基础为什么要用较小的卷积核

目录

0. 前言

在构建卷积神经网络时,我们该挑选多大尺寸的卷积核呢?如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:)

以上是关于卷积神经网络的结构、尺寸的主要内容,如果未能解决你的问题,请参考以下文章

CNN基础——卷积神经网络的组成

CNN基础为什么要用较小的卷积核

CNN基础为什么要用较小的卷积核

Keras深度学习实战——卷积神经网络的局限性

4.1 卷积神经网络

mobilenet输入尺寸