VGG

VGG的网络结构大致总结一下,就是增大网络深度,利用较小的3*3的卷积核,并尝试使用1*1的卷积核。1*1的卷积核是线性变换,但在该卷积核后面紧跟着非线性激活函数,所以1*1卷积核增大了网络的非线性作用。

然后是如何进行训练。我们一条一条的过。看文献的时候,太多,容易蒙。

对训练图像大小的定义

首先是单尺度图像的训练。作者在文中定义了两个单尺度。是通多定义最小边的大小来定义图像尺度的大小。

然后是多尺度图像的训练。那么如何得到多尺度的图像呢。首先定义一个最小边的值的范围,然后将训练集中的图像的最小边,随机取样到这个范围内,(每个图像随机取几次不知道)

训练之前需要确定网络参数初始化的方法。本文没有使用IMAGENET的监督预训练。单尺度训练时,作者定义了256和384两个尺度。384的网络根据256训练的参数作为初始化参数,利用更小的学习率来更新参数。而多尺度的训练,是在384网络参数的基础上继续进行训练。那么最开始的256的网络参数是怎么训练的呢?首先我们要知道,作者定义了不同深度的网络结构,对于最浅深度的网络结构,作者采用随机初始化(作者设置的深度认为是足够浅,浅到利用随机初始化也可以得到不错的结果。)对于更深一级的网络,原有的层级参数使用已经训练好的,新增的网络参数继续使用随机初始化。偏置项的大小都设为0(学习率的设定暂时不说,因为没看懂为什么那么变化)。

训练数据设定完成之后,就是测试集的设定了。

对于单尺度图像的测试,如果训练图像是单尺度,那么将测试图像的大小变成训练图像的尺度。如果训练图像是多尺度,那么测试图像的大小取多尺度的最小值和最大值的平均值。(测试过程应该也是类似OVERFEAT)在具体训练的过程中,A和B两个网络结构只进行了一个单尺度训练,(我不知道为什么不进行另一个单尺度的训练)。结果显示,,随着深度增加,精度上升。增加1*1卷积有助于提升精度,但将1*1换成3*3的时候,效果更好,这说明捕捉空间内容还是很重要的.达到19层最深度时,精度达到饱和,精度下降。进行多尺度训练,可以增加分类精度。

对于多尺度图像的测试,根据训练时的输入尺度,选择三个不同的测试图像尺度(对于单尺度训练的,作者根据训练的尺度,左右浮动32.因为作者觉得,训练的尺度如果和测试的尺度如果差别太大,对精度不利。至于为什么选择32,文中没有交代。对于多尺度训练的,测试尺度选择训练尺度的最小值,最大值,平均值)。对测试图像的检测过程类似于OVERFEAT,相当于利用全卷积网络,滑动窗口相当于全连接层的输入大小,在全连接层上一层进行过pooling之后的特征图上滑动。由于输入图像的不同,最后得到的概率图的空间分辨率不同,所以利用平均池化得到固定的特征向量。此时得到每个尺度图像的概率向量。测试图像还可以进行翻转,将得到的未反转的和反转之后的结果进行平均得到最后的结果。(未反转和反转的各包含3个尺度,然后6个概率向量求平均值)

将单尺度测试和多尺度测试的结果进行对比,发现多尺度检测有助于提升精度。

最后作者又考虑了将图像进行多次裁剪进行测试的方法。因为利用全卷积的形式相当于在整个图像上进行测试。而一些文献表明,利用多裁剪的方式可以提高分类精度。而且,文中对比了一下这两种方法在卷积时的对周围环境的捕捉,裁剪方法要用0来进行padding,而全卷积形式经过卷积核pooling的操作,顺其自然的利用到了周围的图片信息。进行补0的padding扩大了感受野,更多的内容被捕获。(这里我就不明白了,用图像的周围环境不好么,加个0,不突兀么,怎么还捕获了更多的内容呢,捕获了也是0啊)。但是作者又说他觉得靠着裁剪增加的计算时间不能得到相应的精度的提升,所以他和一篇文献进行了对比。(文章读到这里不知道具体是怎么对比的,有什么意义?)

对于多裁剪的测试,训练时在一个尺度范围内进行抽取,然后进行裁剪,将裁剪后的图像输入。测试时先将图像缩放到三个固定的尺度,然后进行裁剪。具体怎么进行裁剪,还没看太明白。

文章的最后是如何进行VGG网络进行定位的,看不太懂。但现在已经有了更好的目标识别框架,所以就不详细了解了。

你可能感兴趣的:(深度学习图像分类)