一点最重要的学习方法: 当你读一篇论文读不懂时,如果又读了两遍还是懵懵懂懂时怎么办???方法就是别自己死磕了,去百度一下,如果是很好的论文,大多数肯定已经有人读过并作为笔记了的,比如我现在就把我读过以后的收获记下来(我也看了好几篇前人的博文的)。。。百度没有去试试google吧。。。如何快速读懂读明白一篇文章也是一种能力,选择的方法往往大于努力的。
对于这篇论文,网上有很多写的好的总结,大家可以去看,以下我写的内容零零散散,建议大家不要浪费时间看了哦。
文章基于 ILSVRC2013 的数据集进行图像目标的分类、定位与 detection. 对于分类的话,用官方的top-5 error(意思就是你的网络的前5个最可能的分类目标中只要有一个对了就可以,为什么呢?因为吧,图像中可能不仅仅包含要分类的目标还分包括一些不小的目标啦)来衡量网络的性能。对于定位的话,不但要把图像目标用矩形框圈出来,并且要分出正确有目标类别;对于detection, 图像目标中有什么,都找出来什么就可以啦。
对于用卷积神经网络进行图像目标的分类问题,我们要明白一些相关东西。
1. 一个训练好的卷积神经网络,它的相关的参数是固定的对吧, 参数都存在这些地方:第一,卷积核,所以呢,卷积层中的 feature map的个数是固定的,但是它的大小不是固定的哦。 第二就是网络中的全连接层,全连接层的神经元个数不能改变了。。。 总之,在卷积层中,网络的输入大小可以改变,输入大小的不同的结果仅仅是 feature map 大小的不同。 而在全连接层中,我们网络的输入的大小不能改变,必须固定。 在卷积神经网络中,网络的前面基本都是卷积层,而网络的后面几层基本都会跟着全连接层的,所以,这就决定的网络在训练过程中网络的输入的大小应该统一固定,在测试中,网络的输入应该与训练时网络的输入大小保持一致。
以上说的为常用的卷积神经网络。 不过有一种 fully-convnet 可以不受这个限制,它的做法就是把网络的后面的全连接层看层为卷积层来对待。这样,我们在测试时,就可以 multi-scale 的输入了。
2.即然在图像中目标的位置不确定,所以有人提出 slide-window的方法。 但是这个方法基本都是在网络测试时使用,不在网络的训练过程中使用。为什么呢?原因很简单,因为在监督学习中,如果使用 silide-window 进行网络的训练的话, 每个 窗口都要对应一个 label吧, 但是 窗口没有 align 目标的话,你想给什么样的label??对吧,我觉得没法给吧。。。这就是原因。
文章对任务建立了两个分类的模型,分别为快速版与精确版。快速版与精确版的网络结构的主要差别在于:步长的不同,网络层次数的不同,网络的feature map数目的不同。对于下面的网络,前面的卷积层称作为特征提取层,它负责学习输入图像的特征,后面的全连接层称为网络的分类层,负责分类。如果对于定位来说,我们就把后面的分类层改成一个回归网络来训练参数就可以了。
文章对于分类、定位与检测任务怎么处理的呢。文章用一个网络来解决这三个问题, 用一个网络的含义是网络的特征层不变(前面的卷积层),后面的网络类型根据不同的任务改改就可以。。。就这个意思应该是。
快速版的网络结构:
精确版的网络结构:
两个网络的参数个数与连接的数目的对比,如下图所示:我们会发现快速版的网络结构的参数多于精确版本的,但是呢,精确版本的连接数目远远多于快速版本哦,为什么呢?因为吧,参数最多的地方为卷积层与全连接层的相交之处, 而卷积层的参数相对较少的。
分类任务
要说明一点:基于 LILSVRC data的图像相关任务中,由于图像中的目标在图像中的位置不确定可能中间啦,可能上下左右啦;还有有时候目标的大小相对于图像来说不是很大,只占一小部分;还图像中的背景中的目标有对网络的性能有影响,所以都是把图像的 fixed-crop 输入给网络进行训练或测试。(对比手写字体 MNIST 的识别任务,那里的data 的像素很小吧,并且图像中只有一个目标,背景还都是白色)
对于图像的分类的网络的训练方法:
训练数据的获取:基本一样吧,给一个图片,取图像的 fixed-crop (如上面的两个模型分别为231*231和221*221)进行训练。对于具体的 crop的方法那就自己看着来好了,文中采用的方法是首先把图像进行缩放到最小边长(可能原始图像不是正方形吧)为256像素,然后random 截取 5个大小为221*221的 c rops,然后水平一翻转就增加了10了吧。
网络训练相关的配置:说说文中的吧, mini-batch 为128;权值初始化为:mean为0,variation为0.01的正态分布;权值更新的momentum term 为0.6;L2的权值衰减为1*10-5;学习速率初始化为0.05,然后在30,50,60,70,80的epoch时减为原来的0.5;对于最后的全连接层进行 0.5 rate 的dropout;网络的激活函数为:RELU;
好啦,基本这样子,训练就可以了。。
网络的测试(文章中叫作:classificaiton):
这是应该说是文章的重要重要的重要的重要的地方,有价值的地方,OverFeat.
前面已经说过了,在测试的时候,我们通常采用slide-window的方法的图像上所有可能的位置选取 crops进行分类的。 对于一般的网络的话,看上去运算量很大,但是呢,对于卷积神经网络来说,它的效率还是很高的,因为对于需要重叠计算的地方它可以共享 computation.下面具体来说说哈:
1,首说一下什么是 fully-convolutional network,上面其实说过了,把后面的全连接层当作卷积层来对待,我用比较喜欢用图说明一下:
对于正常的卷积神经网络是下面这个图:
对于fully-convnet,后面网络的变化为:
此时,我们的输入的大小可以与训练时的大小不相同(如果比训练时尺寸小的话,zero-padding 就可以啦),如下面:
2,卷积神经网络滑动窗口的实现:对于测试时采用的slide-window的原始图像上进行滑动,对于卷积神经网络来说,会怎么样呢?看下面的图的举例:
当我们的输入的窗口大小为14*14时如下图所示:(后面的classifier就是我们的全连接层看作卷积层的样子)
现在假设我们的输入的图像为16*16,这时为这样子的:
解释一下:
1. 我们输入的为16*16的大小,最后输出的为2*2的大小。对于对于原始图像的左上角的14*14的大小看作窗口输入时,这个窗口的最后输出为2*2output的左上角那里。当我们对原始图像的右上角的14*14的大小看作窗口输入时,这个窗口的最后输出为2*2output的右上角那里(图上没有表示出来)…………。看到了吧,这个卷积网络一下子就可以把所有可能的窗口的输出都计算出来了。。很efficient, 原因就是在重叠的窗口上的数据不用重复计算。
2. 上面的例子也是为了让我们好明白简化了一下过程(或着说理想的过程),在实际中,可能由于zero-padding的原因,仅仅分影响部分计算过程中的边缘的数据而已(单独测试窗口的输入时会补0,而用fully-convnet 同时运算时,会补相邻的像素值)
3. 分辩率的问题:上面的分辨率为 2,因为pooling的步长为2哦。。当在原始图像中的窗口平移2个像素值时,就会对应一个 output. 在文章的精确版本中分辨率为2*3*2*3=36.
增加分辩率:
精确版的最后一层(第六层)的pooling 层为3*3的步长。现在想办法来remove 掉该pooling层的loss of resolution.方法是在pooling的时候给它加一个 offset。 具体用一维的例子说明:下面是文章中的配图:
假设图中(a)为第6层卷积以后且没有pooling的feature map,然后呢,图(b)为对图(a)进行pooling , 加的offset分别为0,1,2. 图(C)的话表示后面的相关卷积了,就不用管了,重点是图(b)的操作。通过这样的操作,就可以把pooling的操作损失的分辩率找回来。分辩率由原来的2*3*2*3变为了2*3*2。
下面我用在二维的平面的图示来说明一下:
解释一下:图中的原始图像为红色的一个矩形图。然后呢,图上的crop1,crop2,crop3,它们的水平与垂直的滑动都为12个像素的。其实它们就对应了在上面的精确版的最后一层(第六层)的pooling 层的offset分别为0,1,2(水平垂直同时位移)的pooling后得到的feature map. 而 crop4, crop 5, crop6 对应了对于offset为2 得到的feature map 进行 后面步长为5*5的卷积得到的 feature map里对应值,在原始图像中位移为36个像素;而crop4, crop 5, crop6 大小 为221*221. 如果我们把crop1 ,crop2, crop3 看作一级子图,而 crop4, crop5, crop6 看作二级子图的话,那么在原始图像中,经过上面的offset 机制我们可以得到3*3的9张的 一级子图,像素位移为12个像素, 而在每一个一级子图里面进行位移为36个像素的窗口滑动。这样它们交叉起来,窗口滑动的像素即为12个像素哦。这样的话,使分辨率变为了12个像素哦(我自己已经推过了), 增加了分辨率了吧(以前为36个像素)。
现在举个例子怎么进行分类的哈,采用精确版的模型。
当我们输入大小为257*293时,最第6层卷积完成以后不进行max-pooling得到的feature map的大小为18*21. 然后呢,我们采用不进行上面offset形式的的pooling,直接进行步长为3*3的pooling,我们得到大小为 6*7的 feature map,然后再进行7-9层的卷积操作,最后得到1000个2*3的一个输出。 这个输出表示了什么意思呢??它就代表了在原始图像上大小为221*221窗口进行36个像素的滑动步长得到一系列crops(共2*3=6个)的对应每一类别的概率哦;然后,我们取6个当中概率最大的一个就可以啦。
当我们输入大小为281*317时,最第6层卷积完成以后不进行max-pooling得到的feature map的大小为20*23. 然后呢,我们采用上面offset分别为0, 1, 2的形式的的3*3的pooling, ,我们得到大小为 9个大小为6*7的 feature map,然后再进行7-9层的卷积操作,最后得到9 * 1000个2*3的一个输出。 这个输出表示了什么意思呢??它就代表了在原始图像上大小为221*221窗口进行12个像素的滑动步长得到一系列crops(共2*3*9=54个)的对应每一类别的概率哦;然后,我们选取这些当中概率最大的一个就可以啦。
multiple scale操作:
上面的操作我们只是对single-scale进行的哈,我们可以选择不同的scale进行操作,然后求平均的。下图列出了文章中的6种不同scale(即图像的大小不一样啦)。表中的layer 5应该针对的快速版的模型。
localization
不想写了呢,怎么。
Detection
不想写了呢,怎么。