zoukankan      html  css  js  c++  java
  • 从AlexNet(2012)开始

    博客:blog.shinelee.me | 博客园 | CSDN

    写在前面

    本文重点在于回顾深度神经网络在CV领域的First Blood——AlexNet,AlexNet是首个在大规模图像识别问题取得突破性进展的深度神经网络,相比基于SIFT+FVs、稀疏编码的传统方法,性能提升了10多个百分点(error rate 26.2% → 15.3%,ILSVRC-2012),并由此开启了深度神经网络血洗CV各领域的开端,如下图所示(SuperVision即AlexNet)。

    ImageNet Classification error throughout years and groups

    截止本文时间2019年9月2日,AlexNet论文的引用量达45305,论文作者Alex Krizhevsky、Ilya Sutskever和“深度学习之父”Geoff Hinton。

    citations

    网络结构

    AlexNet的原始网络结构如下,可以参见caffe的网络定义bvlc_alexnet,pytorch等也给出了变种实现,见torchvision/models/alexnet.py

    AlexNet architecture

    整个网络大体由5个卷积层和3个全连接层组成,受限于当时的计算资源,网络通过2块GTX580 3GB的GPU训练,上图可见,整个网络上下一分为二,各用1块GPU训练(在caffe中通过group层实现),每个GPU放一半的神经元,网络中第3个卷积层和3个全连接层跨GPU连接。与使用单个GPU和50%神经元的网络相比,这个双GPU方案的Top1和Top5错误率分别降低了1.7%和1.2%。

    每层的配置如下,第一个卷积层的kernel size为11,stride为4:

    AlexNet architecture

    创新点

    为了获得最佳表现,论文中综合应用了很多技术,有些后来已成为通用的标准做法。

    • 使用ReLU作为激活函数,作为non-saturating非线性激活函数有效避免了梯度消失问题,同时与tanh(saturating非线性激活函数)相比,训练速度提升了数倍(CIFAR-10上训练达到25%错误率速度快了6倍)。

    • 多GPU训练,实际上相当于增加了网络的宽度,如上节所述,Top1和Top5错误率比单GPU网络分别降低了1.7%和1.2%。

    • 提出了LRN(Local Response Normalization)层,使用相邻(n)个特征图上同位置的值对当前值进行归一化,公式如下。LRN被认为没有太大效果,已不被后来者采用。

      [b_{x, y}^{i}=a_{x, y}^{i} /left(k+alpha sum_{j=max (0, i-n / 2)}^{min (N-1, i+n / 2)}left(a_{x, y}^{j} ight)^{2} ight)^{eta} ]

    • 使用Overlapping Max-Pooling,如上节图中,Pooling层的kernel size (z=3),stride (s=2)(z > s),与(s=z=2)相比,Top1和Top5错误率分别下降了0.4%和0.3%。

    • 通过Data Augmentation数据增广降低过拟合,提高预测准确度

      • 训练阶段,通过生成大量训练数据来降低过拟合,生成数据的方式有2种,
        • 第1种方式从(256 imes 256)图像中随机裁剪+左右翻转出(224 imes 224)的图像,将训练数据扩大了2048倍;
        • 第2种方式对每张训练图像RGB通道做数值扰动,扰动量通过对整个训练集的RGB像素进行PCA获得,扰动量为(left[mathbf{P}_{1}, mathbf{P}_{2}, mathbf{P}_{3} ight]left[alpha_{1} lambda_{1}, alpha_{2} lambda_{2}, alpha_{3} lambda_{3} ight]^{T})(mathbf{P}_{i})(lambda_{i})为RGB像素协方差矩阵的特征向量和特征值,(alpha_{i})为0均值0.1标准差的高斯随机值。
      • 预测阶段,从待预测(256 imes 256)图中上下左右中间crop+左右翻转得到10张(224 imes 224)的图像,逐一输入网,络对输出结果取平均,来提升预测阶段的准确率,相当于数据层面的集成学习
    • 对前2个全连接层使用Dropout技术,训练时每次随机让50%的神经元输出为0,以此来降低过拟合,预测时将权重乘以0.5。这样可以强迫网络学习到更鲁棒的特征,也可以从集成学习的视角理解,预测阶段相当于对随机到的所有模型求了个期望。

      dropout

    • batchsize 128,SGD Momentum 0.9,weight decay 0.0005,initial learning rate 0.01 停滞时divide by 10,

    [egin{aligned} v_{i+1} & :=0.9 cdot v_{i}-0.0005 cdot epsilon cdot w_{i}-epsilon cdotleftlangleleft.frac{partial L}{partial w} ight|_{w_{i}} ight angle_{D_{i}} \ w_{i+1} & :=w_{i}+v_{i+1} end{aligned} ]

    其他有意思的点

    回顾AlexNet论文,发现论文中提及了很多有意思的点,有些仅仅是一笔带过,但是可能启发了后面大量的工作,翻回来看才发现“祖师爷”早有预兆。

    • finetune,在一个库上训练,在另一个库上finetune

      AlexNet finetune

    • 权重可视化,仅可视化第1个卷积层的96个卷积核权重,发现网络学到了频率方向性的特征,更有意思的是,GPU1上的48个卷积核是颜色无关的,GPU2上的是颜色相关的。

    96 Convolutional Kernels

    • 匹配与检索,使用最后一个全连接层的输出作为特征,通过欧氏距离可计算图像间的特征相似度,可做匹配,提出可以通过auto-encoder进一步压缩获取到short binary code,可用于检索,如下图所示,检索与最左边一列特征最近的图像

      retrieve images

    • 深度十分重要,增加深度可以进一步提升性能,当前性能只是受限于计算资源和训练时间(微笑)

      depth is important

    depth is important

    • 在ILSVRC 2012上做的报告展示了使用AlexNet做detection的结果,如下

      AlexNet Localization

    不愧是开创性工作的paper,给这含金量跪了。

    参考

  • 相关阅读:
    python不同包之间调用时提示文件模块不存在的问题
    adb shell 查看内存信息
    adb shell top 使用
    Android读取logcat信息
    父类的引用对象指向子类的对象
    我的阿里梦——淘宝前端必备技能
    我也做了一个1/4圆形菜单
    可编辑tab选项卡
    canvas 之
    canvas之----浮动小球
  • 原文地址:https://www.cnblogs.com/shine-lee/p/11496738.html
Copyright © 2011-2022 走看看