在前面,我们已经完成Conda的安装、Pytorch环境的搭建,现在就来搭建VGG这个经典的CNN卷积神经网络。
论文简读
还是先来看一下VGG的原论文,VGG这篇论文引用量达到了11万,是一篇传神之作,VGG搭建了第一个具有真正足够“深”的深度学习模型,在上一篇Alexnet中,深度可能也就5层卷积神经网络,但是VGG达到11层,甚至最深达到19层,这个深度是在当时非常深的,而且也需要足够强大的GPU和庞大的数据集才能进行训练。
先简单地阅读论文的内容
1、摘要
这篇文章的主要贡献在于使用具有非常小(3×3)卷积滤波器的架构,对逐渐增加深度的网络进行全面评估。研究结果表明,在将深度推至16至19个权重层时,相较于先前的最先进配置,取得了显著的改进。
2、引言
先是回顾前人在这个领域所做的工作,然后提出本文的工作和贡献:探讨了ConvNet架构设计的另一个重要方面——深度。为此,我们固定了架构的其他参数,并通过增加更多卷积层的方式稳步增加网络的深度,这得益于在所有层中使用非常小的(3×3)卷积滤波器。结果,我们提出了显著更准确的ConvNet架构,不仅在ILSVRC分类和定位任务上达到了最先进的准确性,而且在应用于其他图像识别数据集时,即使作为相对简单流程的一部分(例如,由线性SVM分类的深度特征而无需微调),它们也能取得出色的性能。我们已经发布了我们性能最佳的两个模型,以促进进一步的研究。
3、总结
这项工作中,作者评估了用于大规模图像分类的非常深的卷积网络(多达19个权重层)。结果表明,对于分类准确性,表示深度是有益的,并且可以使用传统的ConvNet架构(LeCun等人,1989年;Krizhevsky等人,2012年)实现在ImageNet挑战数据集上的最先进性能,尽管深度显著增加。在附录中,我们还展示了我们的模型对各种任务和数据集的良好泛化性能,与围绕较浅的图像表示构建的更复杂的识别流程相匹敌或胜过。实验的结果再次证实了视觉表示中深度的重要性。
4、模型的结构
网络的输入是一个固定大小的224 × 224 RGB图像。作者唯一进行的预处理是从每个像素中减去在训练集上计算的平均RGB值。图像通过一系列卷积(conv.)层,其中我们使用具有非常小的感受野的滤波器:3 × 3(这是捕获左/右、上/下、中心概念的最小大小)。在其中一种配置中,我们还使用了1 × 1卷积滤波器,可以看作是输入通道的线性变换(后跟非线性)。
卷积步幅固定为1像素;卷积层输入的空间填充设计为在卷积后保留空间分辨率,即对于3 × 3卷积层,填充为1像素。空间池化由五个最大池化层执行,这些层跟随一些卷积层(并非所有卷积层都跟随最大池化)。最大池化在2 × 2像素窗口上执行,步幅为2。
一系列卷积层(在不同架构中具有不同深度)后跟三个全连接(FC)层:前两个每个有4096个通道,第三个执行1000路ILSVRC分类(就是作者使用的ILSVRC数据集有1000个类别,如果要使用其他的类别数,可以在后面添加线性层,详情可以阅读模型代码),因此包含1000个通道(每个类别一个通道)。
最后一层是softmax层。所有隐藏层都配备有修正线性单元(ReLU)非线性函数。 我们注意到,除了一个网络之外,我们的所有网络都不包含局部响应规范化(LRN)。作者认为这种规范化并不会提高ILSVRC数据集上的性能,但会导致内存消耗和计算时间增加。在适用的情况下,LRN层的参数与中的参数相同。
那么VGG的几种模型可以用下表表示:依次分别为VGG11,VGG11-LRN,VGG13,VGG16,VGG19,这几个模型都不通过卷积层进行下采样,也就是里面的卷积层都会保持输入尺寸的大小,都是通过最大池化进行下采样。
作者这模型对比中提到,VGG网络没有在第一个卷积层中使用相对较大的感受野(例如在(Krizhevsky等人,2012年)中使用11×11的步幅4,或在(Zeiler&Fergus,2013年;Sermanet等人,2014年)中使用7×7的步幅2),而是在整个网络中使用了非常小的3×3感受野,这些感受野在每个像素处与输入进行卷积(步幅为1)。作者提出,两个3×3卷积层的堆叠(之间没有空间池化)具有有效感受野为5×5;三个这样的层具有7×7的有效感受野。那么,例如使用三个3×3卷积层而不是单个7×7层,模型得到了什么好处呢?首先,VGG包含了三个非线性矫正层而不是一个,这使决策函数更有区分度。其次,减少了参数的数量:假设三层3×3卷积堆叠的输入和输出都具有C个通道,则该堆叠由3 × 3 (22个权重层&