论文导读#1:《ImageNet Classification with Deep Convolutional Neural Networks》

目录

论文原版+笔记:

前言

二、数据集

三、网络结构

四、降低过拟合

五、学习细节

六、结果

七、讨论

总结


论文原版+笔记:

链接:https://pan.baidu.com/s/10E5LzDewLlXW8O2WH4AWUw 
提取码:av5z


前言

本文章是笔者读完《ImageNet Classification with Deep Convolutional Neural Networks》后,对于论文的归纳总结,可以给尚未读者作为一个论文概述。

  • 本文为原创,如需转载,请标明出处。
  • 如文中有错误之处,欢迎指出。
  • 如文中有任何侵权行为,请联系删除。

一、介绍

  • 此前分类任务大多使用传统的Machine Learning技术,并且数据集规模较小。
  • 近期大规模数据集的出现:ImageNet...
  • 图片分类任务相对来说是一个复杂的任务,要求模型具有强大的学习能力(learning capacity),并且需要提供先验知识(priori knowledge);只有这样才能使用相对任务复杂度来说较少的数据,学习到一个精准强大的模型。
  • 论文中的CNNs模型可以通过调节单层宽度(width)和网络深度(depth)来控制整个模型的学习能力。
  • 论文中使用的CNNs相对传统的MLP(Multi-Layer Perceptron)具有更少的参数(由于kernel实现了参数共享),所以训练速度上更快。
  • 即使CNNs降低了参数,但是由于图片分类问题的复杂性,网络的参数仍然很多;论文还通过 a) 两个GPU同时训练;b) 高优化的conv操作 ;来加速训练过程

二、数据集

  • Top5 error rate:模型预测结果中5个概率最高的标签中不包含正确标签的比例。
  • ImageNet数据集中的图片尺寸是不固定的,而模型要求输入的尺寸是固定的(224*224)。所以需要对图片进行预处理,将原始图片下采样(down sample)到 256*256 (为什么模型的输入是224*224而下采样到256*256后面有解释)

三、网络结构

论文导读#1:《ImageNet Classification with Deep Convolutional Neural Networks》_第1张图片 论文原图:网络结构

 

  • 网络整体是由 5层卷积层 + 3层全连接层 构成
  • 使用Relu作为激活函数: f(x) = max(0,x);此处选择Relu(non-saturating)替代传统的saturating neuron(类似sigmoid,tanh)是因为saturating neuron在值过大/过小时会产生梯度消失问题。使用了non-saturating neuron得到的结果是加快了网络的训练过程
  • 使用了两个GPU来存储网络的卷积层和全连接层。每个GPU中都保存一份独立的网络参数(对于卷积层来说是kernels,对于全连接层来说是weights和biases)。只有第三层卷积层和所有的全连接层接受前一层的两个GPU的输出作为输入,剩余的卷积层都只接受本GPU的前一层输出作为输入。
  • Local Response Normalization:灵感来源于真实神经元的"侧抑制"(lateral inhibition)效应。形象点说就是一个某个(x,y,channel)点的结果(值)要综合该点同坐标(x,y)其他channel的结果。

        公式:b_{x,y}^i = \frac{a_{x,y}^i}{(k+\sum_{j=max(0,\frac{i-N}{2})}^{min(N, \frac{i+N}{2})} (a_{x,y}^{j})^2)^\beta },其中a_{x,y}^i是map在(x,y)位置,经过kernel_i卷积之后的值。

  • Overlapping Pooling:将pooling的窗口大小记为z*z,每次滑动的大小记为s。传统的Pooling都是s=z,这样每次窗口都不会重叠。而论文中令s降低了overfit。

四、降低过拟合

  • 数据增强一:平移+水平翻转。上面提到了变化尺寸的原始图片经过下采样到256*256的固定尺寸,而网络模型要求的输入是224*224。结合文中提到的通过平移和水平翻转后数据规模扩大了2048倍,推测是将256*256的图片使用224*224大小的滑动窗口通过stride=1滑动,这样可以获得32*32个图片,再将每个图片进行水平翻转。这样就得到32*32*2=2048个图片。(会在后续确认后更新,如果有小伙伴知道的欢迎评论)。测试时将256*256的图片分别取四个角落+中心位置,一共5个图片,并将5个图片分别水平翻转得到10个图片。将这10个图片输入训练好的模型,得到10组结果,对得到的10组结果进行平均得到最终结果。
  • 数据增强二:改变图片RGB通道的强度
  • 在前两个全连接层后应用可能性为0.5的dropout(增加之后,模型大概需要多一倍的时间来达到收敛)

五、学习细节

  • 使用了SGD算法 + momentum

        \large v_{i+1} = 0.9v_{i} - {\color{Red} 0.0005 \epsilon w_{i}} - \epsilon <\frac{\partial L}{\partial w}|_{w_{i}}>_{D_{i}}   

        \large w_{i+1} = w_{i} + v_{i+1}

        其中红色部分为weights decay,论文中说到weights decay不仅起到了正则化的作用,并且还降低了training error。

  • 参数的初始化

        \large W \sim N(0, 0.01)

        \large b = \left\{\begin{matrix} 1 \ \ (2nd, 4th, 5th \ conv ; all \ FC )\\ 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (others) \end{matrix}\right.

  • 如何调整学习率:初始时学习率为0.01,在训练过程中,如果发现validation error rate不再降低,则将学习率除以十;学习率调整三次后结束学习。

六、结果

  • 训练出来的kernels:GPU1中的kernels对颜色不敏感(largely color-agnostic),GPU2中的kernels对颜色敏感(color-specific)。没有很理解为什么两个GPU中的kernels的关注点不同,参数都是随机初始化的(有知道为什么的欢迎留言)。
  • 分析模型预测结果,发现模型输出的top5可能标签是合理的。
  • 通过CNNs得到的特征向量,距离近的特征向量对应的原始图片往往“语义上”很接近(可能像素级别的距离不是很接近)。所以证明CNNs得到的特征向量是合理的。
  • 如果使用CNNs输出的特征向量作为auto-encoder的输入,来进行图片数据压缩,进而进行图片检索。这种方法比直接将原始图片作为auto-encoder的输入要好。

七、讨论

受限于GPU的内存,本论文只采用了5层卷积层,3层全连接层;论文中展望更宽更深的网络,可以取得更加好的分类效果。


总结

本作是Alex在2012年提出,可能距今有些久远,我本人也非班课出身,对于深度网络发展史只是一知半解。据说此篇文章拉开了深度神经网络的序幕,直接掀起了深度网络的潮流。

论文中的创新之处,我个人认为在于

        1. 使用了Relu激活函数替代原本的saturating类的激活函数,加快了训练速度。

        2. 使用卷积层,相对于MLP,减少了网络的参数。

        3. Overlapping Pooling,虽然现在司空见惯,可能当时是一大创新。

        4. 将卷积层的kernels“布置”在两个GPU上。

如果对本文有任何想说的,欢迎留言交流~

你可能感兴趣的:(图像算法,计算机视觉,深度学习,神经网络,图像处理)