微信登录

卷积神经网络 - 经典架构 - LeNet、AlexNet 等

卷积神经网络 - 经典架构 - LeNet、AlexNet 等

引言

卷积神经网络(Convolutional Neural Network, CNN)是深度学习领域中一种非常重要的模型架构,在图像识别、目标检测、语义分割等众多计算机视觉任务中取得了巨大的成功。从早期的开创性工作到如今复杂且高效的架构,CNN 经历了多个发展阶段,涌现出了许多经典的架构。本文将详细介绍其中的 LeNet 和 AlexNet 等经典架构,探讨它们的特点、创新点以及在深度学习发展历程中的重要意义。

LeNet:CNN 的先驱

诞生背景

LeNet 是最早的卷积神经网络之一,由 Yann LeCun 等人在 1998 年提出,最初用于手写数字识别任务,即 MNIST 数据集。在当时,传统的机器学习方法在处理图像数据时面临着特征提取困难、计算复杂度高等问题,而 LeNet 的出现为解决这些问题提供了新的思路。

架构详解

LeNet 主要由卷积层、池化层和全连接层组成,其典型结构为 LeNet - 5,具体架构如下:

层类型 描述
输入层 输入为 32x32 的灰度图像
C1 卷积层 6 个 5x5 的卷积核,步长为 1,输出 6 个 28x28 的特征图
S2 池化层 2x2 的平均池化,步长为 2,输出 6 个 14x14 的特征图
C3 卷积层 16 个 5x5 的卷积核,步长为 1,输出 16 个 10x10 的特征图
S4 池化层 2x2 的平均池化,步长为 2,输出 16 个 5x5 的特征图
C5 卷积层 120 个 5x5 的卷积核,步长为 1,输出 120 个 1x1 的特征图,可看作全连接层
F6 全连接层 84 个神经元
输出层 10 个神经元,对应 0 - 9 的数字分类

创新点与意义

  • 卷积操作:LeNet 引入了卷积层,通过共享卷积核的参数,大大减少了模型的参数数量,同时能够自动提取图像的局部特征,如边缘、角点等。
  • 池化操作:池化层的使用可以降低特征图的维度,减少计算量,同时增强模型的平移不变性。
  • 奠定基础:LeNet 为后续卷积神经网络的发展奠定了基础,其基本架构和思想被广泛应用于各种 CNN 模型中。

代码示例(使用 PyTorch)

  1. import torch
  2. import torch.nn as nn
  3. class LeNet(nn.Module):
  4. def __init__(self):
  5. super(LeNet, self).__init__()
  6. self.conv1 = nn.Conv2d(1, 6, 5)
  7. self.pool = nn.AvgPool2d(2, 2)
  8. self.conv2 = nn.Conv2d(6, 16, 5)
  9. self.fc1 = nn.Linear(16 * 5 * 5, 120)
  10. self.fc2 = nn.Linear(120, 84)
  11. self.fc3 = nn.Linear(84, 10)
  12. def forward(self, x):
  13. x = self.pool(torch.relu(self.conv1(x)))
  14. x = self.pool(torch.relu(self.conv2(x)))
  15. x = x.view(-1, 16 * 5 * 5)
  16. x = torch.relu(self.fc1(x))
  17. x = torch.relu(self.fc2(x))
  18. x = self.fc3(x)
  19. return x

AlexNet:开启深度学习新时代

诞生背景

2012 年,Alex Krizhevsky 等人提出了 AlexNet,并在 ImageNet 大规模视觉识别挑战(ILSVRC)中取得了巨大的成功,以远超第二名的成绩夺冠。这一成果标志着深度学习在计算机视觉领域的崛起,使得卷积神经网络得到了广泛的关注和应用。

架构详解

AlexNet 相比于 LeNet 有了显著的改进和扩展,其架构如下:

层类型 描述
输入层 输入为 224x224 的 RGB 图像
C1 卷积层 96 个 11x11 的卷积核,步长为 4,输出 96 个 55x55 的特征图
P1 池化层 3x3 的最大池化,步长为 2,输出 96 个 27x27 的特征图
C2 卷积层 256 个 5x5 的卷积核,步长为 1,输出 256 个 27x27 的特征图
P2 池化层 3x3 的最大池化,步长为 2,输出 256 个 13x13 的特征图
C3 卷积层 384 个 3x3 的卷积核,步长为 1,输出 384 个 13x13 的特征图
C4 卷积层 384 个 3x3 的卷积核,步长为 1,输出 384 个 13x13 的特征图
C5 卷积层 256 个 3x3 的卷积核,步长为 1,输出 256 个 13x13 的特征图
P3 池化层 3x3 的最大池化,步长为 2,输出 256 个 6x6 的特征图
FC6 全连接层 4096 个神经元
FC7 全连接层 4096 个神经元
输出层 1000 个神经元,对应 ImageNet 的 1000 个类别

创新点与意义

  • ReLU 激活函数:AlexNet 首次使用了修正线性单元(ReLU)作为激活函数,解决了传统 Sigmoid 函数在训练过程中容易出现的梯度消失问题,大大加快了模型的训练速度。
  • 数据增强:采用了随机裁剪、水平翻转等数据增强技术,增加了训练数据的多样性,提高了模型的泛化能力。
  • Dropout 正则化:在全连接层中引入了 Dropout 技术,随机忽略一部分神经元,减少了模型的过拟合现象。
  • 多 GPU 训练:AlexNet 支持在多个 GPU 上并行训练,充分利用了 GPU 的计算资源,使得大规模神经网络的训练成为可能。

代码示例(使用 PyTorch)

  1. import torch
  2. import torch.nn as nn
  3. class AlexNet(nn.Module):
  4. def __init__(self, num_classes=1000):
  5. super(AlexNet, self).__init__()
  6. self.features = nn.Sequential(
  7. nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),
  8. nn.ReLU(inplace=True),
  9. nn.MaxPool2d(kernel_size=3, stride=2),
  10. nn.Conv2d(96, 256, kernel_size=5, padding=2),
  11. nn.ReLU(inplace=True),
  12. nn.MaxPool2d(kernel_size=3, stride=2),
  13. nn.Conv2d(256, 384, kernel_size=3, padding=1),
  14. nn.ReLU(inplace=True),
  15. nn.Conv2d(384, 384, kernel_size=3, padding=1),
  16. nn.ReLU(inplace=True),
  17. nn.Conv2d(384, 256, kernel_size=3, padding=1),
  18. nn.ReLU(inplace=True),
  19. nn.MaxPool2d(kernel_size=3, stride=2),
  20. )
  21. self.classifier = nn.Sequential(
  22. nn.Dropout(),
  23. nn.Linear(256 * 6 * 6, 4096),
  24. nn.ReLU(inplace=True),
  25. nn.Dropout(),
  26. nn.Linear(4096, 4096),
  27. nn.ReLU(inplace=True),
  28. nn.Linear(4096, num_classes),
  29. )
  30. def forward(self, x):
  31. x = self.features(x)
  32. x = torch.flatten(x, 1)
  33. x = self.classifier(x)
  34. return x

总结

LeNet 和 AlexNet 是卷积神经网络发展历程中的两个重要里程碑。LeNet 作为先驱,奠定了 CNN 的基本架构和思想,为后续的研究和应用提供了基础;而 AlexNet 则开启了深度学习在计算机视觉领域的新时代,通过引入一系列创新技术,使得 CNN 在大规模图像分类任务中取得了突破性的进展。随着时间的推移,越来越多的优秀 CNN 架构不断涌现,如 VGG、GoogLeNet、ResNet 等,但 LeNet 和 AlexNet 的贡献不可磨灭,它们的思想和技术仍然对当前的深度学习研究产生着深远的影响。

卷积神经网络 - 经典架构 - LeNet、AlexNet 等