VGG:Very deep Convolutional Networks for large-scale image recognition
ZF:Visualizing and Understanding Convolutional Networks
VGG是牛津大学计算机视觉组(Visual Geometry Group)和(Google DeepMind)公司研究院一起研发的深度卷积神经网络。
VGG的拓展性很强,迁移到其他图片数据上的泛化能力很好。VGG的结构简介,整个网络用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2),用ReLU作为**函数。到目前为止,VGG依然经常被用来提取图像特征。
摘要
论文探究了在卷积网络深度对精度的影响。论文主要贡献是使用非常小(3x3)的卷积过滤器结构来对增加网络深度全面评估,表明通过将深度推到16~19个权重层可以实现显著提升。
1、ConvNet Configurations
inputs:224x224的RGB图像。
- 唯一需要做的预处理就是计算RGB这三个通道平均值,然后训练时减去这些平均值。这样处理网络可以更快的收敛。实验中,作者还采用了1x1大小的卷积核,在这里1x1大小的卷积核不能获取局部信息,只能作为对图片单个像素的线性处理。
- 在网络中,所有的卷积层的大小都是3x3,stride=1,padding=1,那么输出
,会让feature map的大小不变。而max pooling层的kernel为2x2,同时stride=2。
- 卷积层后为两个FC,都为4096维,第三个FC为1000维,最后跟一个softmax层。另外,所有的隐藏层后面都跟一个ReLU**函数来进行非线性处理。
2、classification framework
- 训练:参数配置
- batch size=256
- momentum=0.9
- weight dacay=0.0005
- 前两个FC使用dropout并且dropout ratio = 0.5
- learning rate = 0.01,当验证集准确度停止提升的时候以10倍速度衰减
- VGG使用了Multi-scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁剪224x224的图片,这样可以增加很多数据量,还可以有效防止过拟合。 对初始图片进行裁剪的时候,初始图片不宜过小,要不然裁剪无意义,不宜过大,要不图片只能裁剪到目标的一部分。针对这个问题,文中采用了两种方法:(1)固定尺寸为S=256和S=384,训练后取均值 (2)multi-scale training,训练数据随机从[256, 512]的确定范围进行抽样,这样原始图片尺寸不同,有利于训练。
- 对于比较浅的网络,可以将参数随机初始化,但是对于比较深的网络,则使用前面已经训练好的较浅网络中的参数值对其前几层的卷积层和最后的全连接层进行初始化。
- 测试:
- 作者把测试图片的最短边设置为Q,这个Q与训练过程中的最短边S不一定相等,而且可以对同一张测试图片rescale成不同的大小,即多个scale的同一张图片都在网络中测试,这样可以提升测试效果。在测试阶段作者参考了Sermanet等人的做法,对于网络的全连接层转换为多个卷积层进行处理(可以把全连接层转换为1x1卷积的卷积层,吴恩达课程有讲过)。
- 最后将不同scale的测试图像得到的结果进行average处理作为最后的分类结果。(不同scale图像得到的feature map的
是不同的。在Sermanet首先把一个
的feature map合并为
大小的向量,合并的方法:n个
平面,各取最大值,那么得到一个
大小的向量,最后不同的scale的
的向量再做average)
- 结果:可以参看 https://zhuanlan.zhihu.com/p/32853559
- 卷积核采用3*3?(参考自:https://zhuanlan.zhihu.com/p/32853559)
ZF:Visualizing and Understanding Convolutional Networks
以下参考自:http://blog.csdn.net/hjimce/article/details/50544370(作者:hjimce)
1、相关理论
2014年ECCV上的经典文献:《Visualizing and Understanding Convolution Networks》,可以说是CNN领域可视化理解的开山之作。这篇文献告诉了我们CNN的每一层到底学习了什么特征,然后作者通过可视化调整网络,来提高精度。文献的目的,就是要通过特征可视化,告诉我们如何通过可视化的角度,查看精度是否提高。
2、利用反卷积(Deconvnet)实现特征可视化
为了解释卷积神经网络为什么work,我们需要解释CNN的每一层学习到了什么东西。为了理解网络中的每一层,提取到特征,paper通过反卷积的方法,进行可视化。反卷积可以看作是卷积操作逆过程。反卷积网络本来是用于无监督学习的。但是paper里只是将其用作可视化一个已经训练好的卷积网络模型,没有学习训练的过程。
反卷积可视化以各层得到的特征图作为输入,进行反卷积,得到反卷积结果,用以验证显示各层提取到的特征图。举个例子:假如想要查看Alexnet的conv5提取到了什么东西,我们就哦那个conv5的特征图后面接一个反卷积网络,然后通过:反池化、反**、反卷积,这样一个过程,把本来一张13*13大小的特征图(conv5大小为13*13),放大回去,最后得到一张与原始输入图片一样大小的图片(227*227)。
- 反池化:我们知道,池化过程是不可逆的,但是我们可以通过记录池化过程中,最大**值的坐标位置。然后在反池化的过程中,之把记录下的位置上放上他原来的**值(即最大值),其余位置为0,当然这种过程是一种近似,因为我们在池化的过程中,除了最大值所在的位置,其它的值不为0。
- 反**:在Alexnet中,relu**函数是用于保证每层输出的**值都是正数,因此对于反向过程,我们同样需要保证每层的特征图为正值,也就是说这个反**过程和**过程没有什么差别,都是直接采用relu函数。
- 反卷积:对于反卷积过程,采用卷积过程转置后的滤波器(参数一样,只不过是把参数矩阵水平和垂直方向反转了一下)。
3、理解可视化
特征可视化:一旦我们的网络训练完毕,我们就进行可视化,查看学习到了什么东西。
- 特征可视化结果:总的来说,我们通过CNN学习后,我们学习到的特征,是具有辨别性的特征,比如要我们区分人脸和狗头,那么通过CNN学习后,背景部位的**度基本很少,我们通过可视化就可以看到我们提取的特征忽略了背景,而是把关键信息给提取出来了。从layer1,layer2学习到的基本特征是颜色、边缘等低层特征;layer3则开始稍微变得复杂了,学习到的是纹理特征,比如上面的一些网格纹理,layer4学习到的则是比较有区别性的特征,比如狗头;layer5则学习到的是完整的,具有辨别性关键特征。
-
特征学习的过程:作者给我们显示了,在网络训练过程中,每一层学习到的特征是怎么变化的,上面每一整张图片是网络的某一层特征图,然后每一行有8个小图片,分别表示网络epochs次数为:1、2、5、10、20、30、40、64的特征图:结果:
- 仔细看每一层,在迭代的过程中的变化,出现了sudden jumps;
- 从层与层之间做比较,我们可以看到,低层在训练的过程中基本没啥变化,比较容易收敛,高层的特征学习则变化很大。这解释了低层网络的从训练开始,基本上没有太大的变化,因为梯度弥散嘛。
- 从高层网络conv5的变化过程,我们可以看到,刚开始几次的迭代,基本变化不是很大,但是到了40~50的迭代的时候,变化很大,因此我们以后在训练网络的时候,不要着急看结果,看结果需要保证网络收敛。
- 图像变换:从文献中的图片5可视化结果,我们可以看到对于一张经过缩放、平移等操作的图片来说:对网络的第一层影响比较大,到了后面几层,基本上这些变换提取到的特征没什么比较大的变化。个人总结:我个人感觉学习这篇文献的算法,不在于可视化,而在于学习反卷积网络,如果懂得了反卷积网络,那么在以后的文献中,你会经常遇到这个算法。大部分CNN结构中,如果网络的输出是一整张图片的话,那么就需要使用到反卷积网络,比如图片语义分割、图片去模糊、可视化、图片无监督学习、图片深度估计,像这种网络的输出是一整张图片的任务,很多都有相关的文献,而且都是利用了反卷积网络,取得了牛逼哄哄的结果。所以我觉得我学习这篇文献,更大的意义在于学习反卷积网络。
以下是paper中的一些图片:
下面是图四的放大图: