1、简介算法
VGG Net由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind公司的研究员一块儿研发的的深度卷积神经网络,在 ILSVRC 2014 上取得了第二名的成绩,将 Top-5错误率降到7.3%。它主要的贡献是展现出网络的深度(depth)是算法优良性能的关键部分。目前使用比较多的网络结构主要有ResNet(152-1000层),GooleNet(22层),VGGNet(19层),大多数模型都是基于这几个模型上改进,采用新的优化算法,多模型融合等。到目前为止,VGG Net 依然常常被用来提取图像特征。网络
2、VGG Net的结构ide
图1:VGG16结构图函数
输入是大小为224*224的RGB图像,预处理(preprocession)时计算出三个通道的平均值,在每一个像素上减去平均值(处理后迭代更少,更快收敛)。性能
图像通过一系列卷积层处理,在卷积层中使用了很是小的3*3卷积核,在有些卷积层里则使用了1*1的卷积核。测试
卷积层步长(stride)设置为1个像素,3*3卷积层的填充(padding)设置为1个像素。池化层采用max pooling,共有5层,在一部分卷积层后,max-pooling的窗口是2*2,步长设置为2。优化
卷积层以后是三个全链接层(fully-connected layers,FC)。前两个全链接层均有4096个通道,第三个全链接层有1000个通道,用来分类。全部网络的全链接层配置相同。spa
全链接层后是Softmax,用来分类。3d
全部隐藏层(每一个conv层中间)都使用ReLU做为激活函数。VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提高性能,却致使更多的内存消耗和计算时间(LRN:Local Response Normalization,局部响应归一化,用于加强网络的泛化能力)。orm
3、讨论
一、选择采用3*3的卷积核是由于3*3是最小的可以捕捉像素8邻域信息的的尺寸。
二、使用1*1的卷积核目的是在不影响输入输出的维度状况下,对输入进行形变,再经过ReLU进行非线性处理,提升决策函数的非线性。
三、2个3*3卷积堆叠等于1个5*5卷积,3个3*3堆叠等于1个7*7卷积,感觉野大小不变,而采用更多层、更小的卷积核能够引入更多非线性(更多的隐藏层,从而带来更多非线性函数),提升决策函数判决力,而且带来更少参数。
四、每一个VGG网络都有3个FC层,5个池化层,1个softmax层。
五、在FC层中间采用dropout层,防止过拟合,以下图:
左边的图为一个彻底的全链接层,右边为应用dropout后的全链接层。
咱们知道,典型的神经网络其训练流程是将输入经过网络进行正向传导,而后将偏差进行反向传播。dropout就是针对这一过程之中,随机地删除隐藏层的部分单元,进行上述过程。步骤为:
(1)、随机删除网络中的一些隐藏神经元,保持输入输出神经元不变;
(2)、将输入经过修改后的网络进行前向传播,而后将偏差经过修改后的网络进行反向传播;
(3)、对于另一批的训练样本,重复上述操做(1)。
dropout能够有效防止过拟合,缘由是:
(1)、达到了一种vote的做用。对于单个神经网络而言,将其进行分批,即便不一样的训练集可能会产生不一样程度的过拟合,可是咱们若是将其公用一个损失函数,至关于对其同时进行了优化,取了平均,所以能够较为有效地防止过拟合的发生。
(2)、减小神经元之间复杂的共适应性。当隐藏层神经元被随机删除以后,使得全链接网络具备了必定的稀疏化,从而有效地减轻了不一样特征的协同效应。也就是说,有些特征可能会依赖于固定关系的隐含节点的共同做用,而经过dropout的话,就有效地组织了某些特征在其余特征存在下才有效果的状况,增长了神经网络的鲁棒性。
六、现在用得最多的是VGG16(13层conv + 3层FC)和VGG19(16层conv + 3层FC),注意算层数时不算maxpool层和softmax层,只算conv层和fc层。
3、训练
训练采用多尺度训练(Multi-scale),将原始图像缩放到不一样尺寸 S,而后再随机裁切224*224的图片,而且对图片进行水平翻转和随机RGB色差调整,这样能增长不少数据量,对于防止模型过拟合有很不错的效果。
初始对原始图片进行裁剪时,原始图片的最小边不宜太小,这样的话,裁剪到224*224的时候,就至关于几乎覆盖了整个图片,这样对原始图片进行不一样的随机裁剪获得的图片就基本上没差异,就失去了增长数据集的意义,但同时也不宜过大,这样的话,裁剪到的图片只含有目标的一小部分,也不是很好。
针对上述裁剪的问题,提出的两种解决办法:
(1) 、固定最小边的尺寸为256;
(2) 、随机从[256,512]的肯定范围内进行抽样,这样原始图片尺寸不一,有利于训练,这个方法叫作尺度抖动(scale jittering),有利于训练集加强。
4、测试
将全链接层等效替换为卷积层进行测试,缘由是:
卷积层和全链接层的惟一区别就是卷积层的神经元和输入是局部联系的,而且同一个通道(channel)内的不一样神经元共享权值(weight)。卷积层和全链接层的计算实际上相同,所以能够将全链接层转换为卷积层,只要将卷积核大小设置为输入空间大小便可:例如输入为7*7*512,第一层全链接层输出4096;咱们能够将其看做卷积核大小为7*7,步长为1,没有填充,输出为1*1*4096的卷积层。这样的好处在于输入图像的大小再也不受限制,所以能够高效地对图像做滑动窗式预测;并且全链接层的计算量比较大,等效卷积层的计算量减少了,这样既达到了目的又十分高效。
5、问题
一、虽然 VGGNet 减小了卷积层参数,但实际上其参数空间比 AlexNet 大,其中绝大多数的参数都是来自于第一个全链接层,耗费更多计算资源。在随后的 NIN 中发现将这些全链接层替换为全局平均池化,对于性能影响不大,同时显著下降了参数数量。
二、采用 Pre-trained 方法训练的 VGG model(主要是 D 和 E),相对其余的方法参数空间很大,因此训练一个 VGG 模型一般要花费更长的时间,所幸有公开的 Pre-trained model 让咱们很方便的使用。
参考来源:Very Deep Convolutional Networks for Large-scale Image Recognition