VGG Net学习笔记
VGG Net学习笔记
一、简介
VGG Net 由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind 公司的研究员一起研发的的深度卷积神经网络,在 ILSVRC 2014 上取得了第二名的成绩,将 Top-5 错误率降到 7.3%。它主要的贡献是展示出网络的深度(depth)是算法优良性能的关键部分。目前使用比较多的网络结构主要有 ResNet(152-1000 层),GooleNet(22 层),VGGNet(19 层),大多数模型都是基于这几个模型上改进,采用新的优化算法,多模型融合等。到目前为止,VGG Net 依然经常被用来提取图像特征。
二、VGG Net 的结构

图 1:VGG16 结构图
输入是大小为 224*224 的 RGB 图像,预处理(preprocession)时计算出三个通道的平均值,在每个像素上减去平均值(处理后迭代更少,更快收敛)。
图像经过一系列卷积层处理,在卷积层中使用了非常小的 33 卷积核,在有些卷积层里则使用了 11 的卷积核。
卷积层步长(stride)设置为 1 个像素,33 卷积层的填充(padding)设置为 1 个像素。池化层采用 max pooling,共有 5 层,在一部分卷积层后,max-pooling 的窗口是 22,步长设置为 2。
卷积层之后是三个全连接层(fully-connected layers,FC)。前两个全连接层均有 4096 个通道,第三个全连接层有 1000 个通道,用来分类。所有网络的全连接层配置相同。
全连接层后是 Softmax,用来分类。
所有隐藏层(每个 conv 层中间)都使用 ReLU 作为激活函数。VGGNet 不使用局部响应标准化(LRN),这种标准化并不能在 ILSVRC 数据集上提升性能,却导致更多的内存消耗和计算时间(LRN:Local Response Normalization,局部响应归一化,用于增强网络的泛化能力)。
三、讨论

1、选择采用 33 的卷积核是因为 33 是最小的能够捕捉像素 8 邻域信息的的尺寸。
2、使用 1*1 的卷积核目的是在不影响输入输出的维度情况下,对输入进行形变,再通过 ReLU 进行非线性处理,提高决策函数的非线性。
3、2 个 33 卷积堆叠等于 1 个 55 卷积,3 个 33 堆叠等于 1 个 77 卷积,感受野大小不变,而采用更多层、更小的卷积核可以引入更多非线性(更多的隐藏层,从而带来更多非线性函数),提高决策函数判决力,并且带来更少参数。
4、每个 VGG 网络都有 3 个 FC 层,5 个池化层,1 个 softmax 层。
5、在 FC 层中间采用 dropout 层,防止过拟合,如下图:

左边的图为一个完全的全连接层,右边为应用 dropout 后的全连接层。
我们知道,典型的神经网络其训练流程是将输入通过网络进行正向传导,然后将误差进行反向传播。dropout 就是针对这一过程之中,随机地删除隐藏层的部分单元,进行上述过程。步骤为:
(1)、随机删除网络中的一些隐藏神经元,保持输入输出神经元不变;
(2)、将输入通过修改后的网络进行前向传播,然后将误差通过修改后的网络进行反向传播;
(3)、对于另外一批的训练样本,重复上述操作 (1)。
dropout 可以有效防止过拟合,原因是:
(1)、达到了一种 vote 的作用。对于单个神经网络而言,将其进行分批,即使不同的训练集可能会产生不同程度的过拟合,但是我们如果将其公用一个损失函数,相当于对其同时进行了优化,取了平均,因此可以较为有效地防止过拟合的发生。
(2)、减少神经元之间复杂的共适应性。当隐藏层神经元被随机删除之后,使得全连接网络具有了一定的稀疏化,从而有效地减轻了不同特征的协同效应。也就是说,有些特征可能会依赖于固定关系的隐含节点的共同作用,而通过 dropout 的话,就有效地组织了某些特征在其他特征存在下才有效果的情况,增加了神经网络的鲁棒性。
6、如今用得最多的是 VGG16(13 层 conv + 3 层 FC)和 VGG19(16 层 conv + 3 层 FC),注意算层数时不算 maxpool 层和 softmax 层,只算 conv 层和 fc 层。
三、训练
训练采用多尺度训练(Multi-scale),将原始图像缩放到不同尺寸 S,然后再随机裁切 224*224 的图片,并且对图片进行水平翻转和随机 RGB 色差调整,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。
初始对原始图片进行裁剪时,原始图片的最小边不宜过小,这样的话,裁剪到 224*224 的时候,就相当于几乎覆盖了整个图片,这样对原始图片进行不同的随机裁剪得到的图片就基本上没差别,就失去了增加数据集的意义,但同时也不宜过大,这样的话,裁剪到的图片只含有目标的一小部分,也不是很好。
针对上述裁剪的问题,提出的两种解决办法:
(1) 、固定最小边的尺寸为 256;
(2) 、随机从 [256,512] 的确定范围内进行抽样,这样原始图片尺寸不一,有利于训练,这个方法叫做尺度抖动(scale jittering),有利于训练集增强。
四、测试
将全连接层等效替换为卷积层进行测试,原因是:
卷积层和全连接层的唯一区别就是卷积层的神经元和输入是局部联系的,并且同一个通道(channel)内的不同神经元共享权值(weight)。卷积层和全连接层的计算实际上相同,因此可以将全连接层转换为卷积层,只要将卷积核大小设置为输入空间大小即可:例如输入为 77512,第一层全连接层输出 4096;我们可以将其看作卷积核大小为 77,步长为 1,没有填充,输出为 11*4096 的卷积层。这样的好处在于输入图像的大小不再受限制,因此可以高效地对图像作滑动窗式预测;而且全连接层的计算量比较大,等效卷积层的计算量减小了,这样既达到了目的又十分高效。
五、问题
1、虽然 VGGNet 减少了卷积层参数,但实际上其参数空间比 AlexNet 大,其中绝大多数的参数都是来自于第一个全连接层,耗费更多计算资源。在随后的 NIN 中发现将这些全连接层替换为全局平均池化,对于性能影响不大,同时显著降低了参数数量。
2、采用 Pre-trained 方法训练的 VGG model(主要是 D 和 E),相对其他的方法参数空间很大,所以训练一个 VGG 模型通常要花费更长的时间,所幸有公开的 Pre-trained model 让我们很方便的使用。
参考来源:Very Deep Convolutional Networks for Large-scale Image Recognition

浙公网安备 33010602011771号