AlexNet详解:深度学习指数爆炸的起点

author: abinng date: 2025-12-17 13:17 createDate:2025-11-27 20:56

背景

在LeNet提出后,卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然LeNet在小数据集上取得了很好的效果,但是在更大、更真实的数据集上训练卷积神经网络的性能和可行性还有待研究。事实上,在上世纪90年代初到2012年之间的大部分时间里,神经网络往往被其他机器学习方法超越,如支持向量机(support vector machines)。

而在2012年,ILSVRC大规模视觉识别挑战赛(Imagenet Large Scale Visual Recognition Challenge), AlexNet首次引入了深度卷积神经网络,并获得2012的大规模视觉识别挑战赛的冠军,这标志着深度学习在计算机视觉领域的崭露头角。

结构

AlexNet使用了8层卷积神经网络,与LeNet的架构非常相似 file-20251229185225033

每个卷积块中的基本单元:一个卷积层,一个ReLU激活函数,一个最大池化层

AlexNet和LeNet的设计理念非常相似,但也存在显著差异。

  1. AlexNet比相对较小的LeNet5要深得多。
  2. AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。
  3. AlexNet使用ReLU而不是sigmoid作为其激活函数。加快收敛,减少训练耗时。
    • 这里sigmoid激活函数容易在正区间内得到几乎为0的梯度,导致反向传播时容易有梯度消失的现象,且sigmoid有相较于RuLU复杂的幂运算
  4. 使用最大池化。
  5. 使用了Dropout,提高了模型的准确度,减少了过拟合,后来也被广泛采用。
  6. 使用了三种数据扩增的技术,大幅增加训练数据,增加模型的鲁棒性,减少过拟合。

参数计算:

运用了公式: file-20251229185225036

整个流程相较于LeNet一个亮点是Dropout操作,这是什么呢? AlexNet的进入第一个全连接层的输入是 个,第一个全连接层有4096个神经元,也就是4096个输出,所以此时有 个权重w,4096个偏置b,这参数太多了,容易导致过拟合,而AlexNet引入了一个Dropout的操作,接下来解释一下

Dropout操作是什么?

file-20251229185225035 上图为Dropout操作前后对比

  1. 随机删去网络中的隐藏神经元,输入输出神经元保持不变
  2. 然后正常进行前向传播,把得到的损失结果进行反向传播,在没有被删除的神经元上按照随机梯度下降法更新参数
  3. 重复1和2

图像增强

这个操作是针对数据集的,因为最后训练结果的好坏还与数据集有很大关系 该操作可以解决数据少、防止过拟合

  • 水平翻转:一张图片进行水平反转,就可以当作不同的图片进行投入训练
  • 随机裁剪:一张图片进行随机裁剪,只裁剪图片的一部分,就可以当作不同的图片进行投入训练
  • PCA: 0. 我的理解就是,图像分为RGB三个通道,也就是三个矩阵,通过对三个矩阵里面的所有数字进行归一化处理、分别展平得到三个长条矩阵、之后经过我目前不懂的计算得到一个(3, 1)大小的矩阵,也就是三个数字,将这三个数字分别加到对应的三个矩阵(R,G,B)上面,三个RGB矩阵就可以表示一张图像了,也就是新的图像。
    1. 将图片按照RGB三通道进行normalization(归一化)处理,保证均值为0,方差为1
    2. 将图片按照channel展平成大小为(H * W, 3)的矩阵
    3. 计算展平后的矩阵的协方差矩阵,大小为(3, 3)
    4. 对协方差矩阵进行特征分解,得到对应的特征向量和特征值
    5. 设置一个抖动系数,该抖动系数是一个(3,1)大小的矩阵,里面的元素是随机值,利用抖动系数和对应的特征进行相乘,依然得到一个(3,1)大小的矩阵,对该矩阵进行转置并和特征向量进行矩阵相乘,得到一个(3,1)大小的矩阵
    6. 利用上述最后计算出来的(3,1)大小的矩阵,其中的3个值分别加到原图像的R,G,B三通道上,就是最后得到的增强的图像。 经过上述说的图像增强,就可以将数据集加倍

LRN(局部归一化)

==(注意)该方法到批量归一化(Batch Normalization, BN)之后没有什么人用,因为没什么提升==

  • 用到公式:
    • N是总通道数
    • 超参数
    • 因变量,自变量
  • 有什么用:对局部的值进行归一化操作,使其中比较大的值变得相对更大,增强了局部的对比度,提升了模型的泛化能力,在AlexNet中有1.2个百分比左右的提升
  • 流程: file-20251229185225032
  1. 个人理解:结合上图,该图是四个通道。个人理解这个公式就是,计算该位置的值和邻域内(由n决定邻域大小)的值的平方和配上一些超参数调整作为分母,分子是该位置的值,最终得到一个新的值,此时该位置就操作结束
    • 例如:n=2,超参数为时,以通道二(红色)最左上角的值为例,邻域就是1,因为n/2=1,此时就是计算
  2. 手动设置超参数
  3. 对每个值利用公式计算局部归一化之后的值

实操

总体流程相较于LeNet-5基本没变,依旧是

  • 搭建模型model.py,拼装一个AlexNet的经典层次
  • 模型训练model_train.py(先处理数据,训练模型就是一行代码的事)
  • 模型测试model_test.py(只需要前向传播)

代码

GitHub - abinng/Blog-code: 用于存放我博客中的代码

进入后右上角可以给仓库一个Star哦~(´▽`ʃ♡ƪ)