Alex Krizhevsky在《 深度卷积神经网络的ImageNet分类》一文中提出了深度卷积神经网络模型 AlexNet,是LeNet的一种更深更宽的版本。这是第一次将深度卷积神经网络 (CNN)、GPU 和巨大的互联网来源数据集(ImageNet)结合在一起。 AlexNet首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。AlexNet包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。它以显著的优势赢得了 当年ILSVRC 2012奖,top-5的错误率(指给定一张图像,其标签不在模型认为最有可能的5个结果中的几率)降低至15.4%。AlexNet是神经网络在第二次低谷期后的第一次呐喊, 确立了深度学习(深度卷积神经网络)在计算机视觉的统治地位,也推动了深度学习在语音识别、自然语言处理、强化学习等领域的拓展。




adaboost和卷积神经网络 卷积神经网络alexnet_神经网络


AlexNet主要使用到的新技术点如下:

  • 成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,解决了Sigmoid在网络较深时的梯度弥散问题。
  • 训练时使用Dropout随机失活(忽略)一部分神经元,以避免模型过拟合。


adaboost和卷积神经网络 卷积神经网络alexnet_pytorch_02


  • 在CNN中使用重叠的最大池化。AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
  • 提出了LRN(局部响应归一化)层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
  • 使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。
  • 数据增强,随机地从256´256的原始图像中截取224´224大小的区域(以及水平翻转的镜像),相当于增加了(256-224)2´2=2048倍的数据量。

AlexNet网络结构:

整个AlexNet有8个需要训练参数的层(不包括池化层和LRN层),前5层为卷积层,后3层为全连接层,如图所示:


adaboost和卷积神经网络 卷积神经网络alexnet_深度学习_03


adaboost和卷积神经网络 卷积神经网络alexnet_pytorch_04


  • 输入:input_size = [224, 224, 3]
  • 卷积层:
  • kernels = 48 * 2 = 96个卷积核
  • kernel_size = 11 * 11
  • padding = [1, 2] (左上围加半圈0,右下围加2倍的半圈0)
  • stride = 4
  • 输出:output_size = [55, 55, 96]

经 Conv1 卷积后的输出特征图像尺寸为:


adaboost和卷积神经网络 卷积神经网络alexnet_深度学习_05


池化层只改变图片矩阵大小,不改变其深度。即经MaxPool1后的输出特征图像尺寸为:


adaboost和卷积神经网络 卷积神经网络alexnet_分类_06


历经AlexNet网络的5层卷积层训练,在MaxPool3后的最终输出特征图像尺寸为[6, 6, 256]:


adaboost和卷积神经网络 卷积神经网络alexnet_adaboost和卷积神经网络_07


AlexNet网络的全连接层:FC1、FC2、FC3


adaboost和卷积神经网络 卷积神经网络alexnet_深度学习_08


最后一层是有1000类输出的Softmax层用作分类。


adaboost和卷积神经网络 卷积神经网络alexnet_神经网络_09


adaboost和卷积神经网络 卷积神经网络alexnet_adaboost和卷积神经网络_10


分析可见,除了Conv1外,AlexNet网络的其余卷积层都是在改变特征矩阵的深度(逐步加深),而池化层则只改变(缩小)其尺寸。


adaboost和卷积神经网络 卷积神经网络alexnet_pytorch_11


adaboost和卷积神经网络 卷积神经网络alexnet_深度学习_12


AlexNet最后一层是有1000类输出的Softmax层用作分类。 LRN层出现在第1个及第2个卷积层后,而最大池化层出现在两个LRN层及最后一个卷积层后。ReLU激活函数则应用在这8层每一层的后面。

因为AlexNet训练时使用了两块GPU,因此这个结构图中不少组件都被拆为了两部分。现在我们GPU的显存可以放下全部模型参数,因此只考虑一块GPU的情况即可。