ImageNet with Deep CNN阅读笔记

本来直接看的R-CNN那篇文章的,结果发现network architecture部分一脸懵,只能悄悄找到最原始的这篇看,R-CNN是基于这篇文章的网络结构的。我的学习过程真的是小白进步史,要从最简单的一步步学起。
文章是在ImageNet那个比赛识别MNIST数据集的,正好承接了上本我看完的Neural network and deep learning这本书。主要看的就是第三部分Architecture。关于这篇文章的博客有很多,如果有人觉得有雷同了可以联系我~

文章链接放这里ImageNet Classification with Deep Convolutional Neural Networks

这个网络分了一千两百万张图像,共1000类,top-1和top-5的错误率分别是37.5%和17.0%,比之前其他的网络都好得多。这个网络有6亿个参数和65万个神经元,5层卷积层,三层全连接层,最后是一层1000输出的softmax层。前面有intro和data set部分就懒得看了,反正就是MNIST数据集,重点从第三部分开始。

Architecture

这一段讲了网络的结构和作者加进去的一些使网络更好的techniques。

ReLU

之前那本书里提到了很多次关于激活函数sigmoid函数(有时候也会使用tanh函数)的学习速率变慢的问题,sigmoid函数:f(x)=(1+e-x)-1,这个函数在很大和很小的时候趋于平缓,所以导数趋近于0。而我们使用的随机梯度下降算法SGD中,对于权重w和偏置b的改变量就是基于sigmoid函数的导数f’(z)的,其中z=wx+b,当z很大或者很小的时候,f’(z)趋近于0,则学习速率变慢,参数改变量很小。
基于这个问题,作者把sigmoid函数换成了矫正线性单元Rectified Linear Units(ReLU),f(x)=max(0,x),这一改变大大提高了学习速度,下图实线是ReLU的正确率,虚线是tanh函数的正确率:

Training on multiple GPUs

一个GPU只有3GB的内存,对于这个网络来说太小,作者使用两个GPU来同时运行处理数据。现在的GPU很容易进行多GPU并行处理,因为它们可以对其他GPU内存直接进行读写操作,而不需要经过主机。
我们将一半的神经元放在一个GPU上,但是GPU之间的数据交换只发生在某些特定的层:比如,第三层接收第二层的所有神经元的输出,但是第四层只接收同一个GPU上第三层的输出,也就是说,第四层其中一半只接收同一个GPU上的第三层,不跟另外一个GPU发生数据交换。我把2、3、4层的示意图放到下方,从虚线示意可以看出,中间的层是两个GPU上的输出都接收了,但是最后一层只接收同一个GPU上的数据:

top-1和top-5错误率分别减少了1.7%和1.2%。

Local Response Normalization

记aix,y为第i个神经元在(x,y)处的激活值,归一化之后的值bix,y为:

括号里的求和是计算了这个神经元周围n个毗邻的神经元的激活值,N是这一层的神经元的个数。神经元的顺序是随意的,在训练之前就定下来了。这种响应归一化的方法实现了一种边缘抑制。k,n, α \alpha , β \beta 都是参数,作者取k=2,n=5, α \alpha =10-4 β \beta =0.75。我们在ReLU之后使用响应归一化。
top-1和top-5错误率减少了1.4%和1.2%。

Overlapping Pooling

这个很好理解,就是池化的区域重叠了。池化层可以想象成很多池化单元,相隔s个像素,每一个网格都是以池化单元为中心的z*z的区域。当s=z时是传统的池化方法,当s<z时,池化区域就重叠了。作者选了s=2,z=3,得到了比s=2,z=2时更好的准确率:top-1和top-5错误率减少了0.4%和0.3%。

Overall Architecture

总体来说,结构上有8层,5层卷积层,3层全连接层,其中2、4、5层只连接了同一个GPU上前一层的神经元,而第三层是连接了第二层中所有的神经元。结构图:

响应归一化在第一层和第二层之后做。max-pooling层在两个响应归一化后以及第五层之后做。八层都是用ReLU作为激活函数。
下面分析一下每一层的size。输入图像为224* 224* 3大小的(由于有三个通道),第一层是由96个11* 11* 3的卷积核卷积而成,步长stride为4。从结构图中可以看到,第一层是两个55* 55* 48的卷积层(上面那个GPU的卷积层只画了一半)。
首先48是怎么来的呢?之前说过,有多少了卷积核就有多少个特征图,就是说一种卷积核可以检测输入图像的其中一种特征,我们用了96个卷积核,就有96个特征图,分到两个GPU上,每个GPU训练48个特征图。那55是怎么来的呢?在之前的笔记中有讲到,这边重新加深印象,卷积层size(无padding)的计算方法是:[(输入图像大小-卷积核大小)/步长]+1,这个应该很好理解,然后输入大小224,卷积核大小11,步长4,算出来为55,所以一个卷积核在输入图像上滑动,做了55* 55次卷积,得到了一张特征图。
啊终于说完了,这个问题我第一次看的时候总是搞不懂,不知道55* 55* 48到底怎么算出来的,还以为是作者自己设定的。
之后的层数也是同样的算法,第二层卷积层是27* 27* 128,是由256个5* 5* 48的卷积核对第一层卷积层做卷积得到的。第一层和第二层卷积层之后都有pooling层和normalization层。
第三层是13* 13* 192,可以算出由3* 3* 128的卷积核,步长为2,对第二层卷积得到。第四层由3* 3* 192的卷积核卷出来的,但是大小与第三层一样还是13* 13* 192,说明第四层在卷积的时候对第三层做了padding。padding可以简要理解成在原先的层周围加一圈,计算方法为:[(输入图像大小+2* padding-卷积核大小)/步长]+1,由这个式子我们可以看出,当取步长为1,padding为1的时候,第四层大小为13* 13* 192。第五层大小为13* 13* 192。三、四、五层之后都没有池化层和归一化。六、七层都是两个2048的全连接层。最后一层输出层则是有1000个神经元,代表了1000种分类。

Reduce overfitting

Data Augmentation

过拟合overfit是出现了网络在训练集上可以得到很好的效果,但是在验证集或者测试集上的效果反而下降了的一种现象,使用更大的数据集做训练可以很好地避免这种情况。有一种数据增强的方式就是对训练集中的图片做一些微小的调整,比如上下左右移动一个像素。这种调整直接由程度指挥在CPU上进行,不影响GPU上的训练,所以这种数据增强的方式是不需要花计算时间的。
作者介绍了两种数据增强的方式。第一是从256* 256的图像中随机选取224* 224的区域以及这个区域的水平镜像区域(这也是输入图像为224* 224* 3的原因),这样子一张256* 256的图像可以选出2048张224224的图像,所以我们将训练集扩大了2048倍。在测试的时候,网络选取图像四角和中间的5张224 224的图像以及它们的水平镜像图像,一共10张图像来做预测。
第二种方式是改变RGB通道的强度,使用PCA(主成分分析方法)来对数据做改变。对于每一个RGB图像像素Ixy=[IxyR, IxyG, IxyB]T,加上:

pi λ \lambda i是RGB像素的3* 3协方差矩阵的特征向量和特征值, α \alpha i是从均值为0,标准差0.1的高斯分布中取的随机变量。在一次训练中,对于一张图像上的所有RGB像素值, α \alpha i只取一次。

Dropout

除了增加数据集,还有一种方法是用多个网络进行训练,并将结果整合,但是训练的时间会成倍增加。有一种方法Dropout只需要两倍的时间就可以达到很好的效果。这种方法就是随机选取一半的神经元将其输出设为0,即这部分神经元既不参与前向传播也不参与后向传播。所以每次有了新的输入,神经网络的结构都是不同的,但是他们都有一样的参数。在测试的时候,我们使用所有的神经元,但是将其输出乘0.5,就是上述方法的近似。

好哩所有的重点都说完了,下一篇开始学习Ross的那篇R-CNN的论文。

猜你喜欢

转载自blog.csdn.net/niyidan0527/article/details/86618878