微信登录

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

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

一、引言

卷积神经网络(Convolutional Neural Network, CNN)在计算机视觉领域取得了巨大的成功,它能够自动从图像数据中提取特征,在图像分类、目标检测、语义分割等任务中表现出色。在 CNN 的发展历程中,出现了许多经典的架构,如 LeNet、AlexNet 等,这些架构为后续 CNN 的研究和应用奠定了基础。本文将介绍这些经典架构,并使用 TensorFlow 实现简单示例。

二、LeNet

2.1 架构介绍

LeNet 是最早的卷积神经网络之一,由 Yann LeCun 等人在 1998 年提出,主要用于手写数字识别任务(MNIST 数据集)。LeNet 架构相对简单,包含卷积层、池化层和全连接层,其主要特点如下:

  • 卷积层:用于提取图像的局部特征。
  • 池化层:对特征图进行下采样,减少数据量。
  • 全连接层:将特征图转换为分类结果。

LeNet 的典型结构包含两个卷积层、两个池化层和三个全连接层,具体结构如下:

  1. 输入层:输入 32x32 灰度图像。
  2. 卷积层 C1:6 个 5x5 卷积核,输出 6 个 28x28 特征图。
  3. 池化层 S2:2x2 平均池化,输出 6 个 14x14 特征图。
  4. 卷积层 C3:16 个 5x5 卷积核,输出 16 个 10x10 特征图。
  5. 池化层 S4:2x2 平均池化,输出 16 个 5x5 特征图。
  6. 全连接层 F5:120 个神经元。
  7. 全连接层 F6:84 个神经元。
  8. 输出层:10 个神经元,对应 0 - 9 十个数字类别。

2.2 TensorFlow 实现

  1. import tensorflow as tf
  2. from tensorflow.keras import layers, models
  3. # 构建 LeNet 模型
  4. def LeNet():
  5. model = models.Sequential()
  6. # 卷积层 C1
  7. model.add(layers.Conv2D(6, (5, 5), activation='relu', input_shape=(32, 32, 1)))
  8. # 池化层 S2
  9. model.add(layers.AveragePooling2D((2, 2)))
  10. # 卷积层 C3
  11. model.add(layers.Conv2D(16, (5, 5), activation='relu'))
  12. # 池化层 S4
  13. model.add(layers.AveragePooling2D((2, 2)))
  14. # 展平
  15. model.add(layers.Flatten())
  16. # 全连接层 F5
  17. model.add(layers.Dense(120, activation='relu'))
  18. # 全连接层 F6
  19. model.add(layers.Dense(84, activation='relu'))
  20. # 输出层
  21. model.add(layers.Dense(10, activation='softmax'))
  22. return model
  23. # 创建模型实例
  24. model = LeNet()
  25. # 打印模型结构
  26. model.summary()

三、AlexNet

3.1 架构介绍

AlexNet 由 Alex Krizhevsky 等人在 2012 年提出,在当年的 ImageNet 图像分类竞赛中取得了巨大的成功,它的出现标志着深度学习在计算机视觉领域的崛起。AlexNet 相比 LeNet 有了很大的改进,主要特点如下:

  • 更深的网络结构:包含 5 个卷积层和 3 个全连接层。
  • ReLU 激活函数:替代了传统的 Sigmoid 函数,缓解了梯度消失问题。
  • Dropout 技术:防止过拟合。
  • 数据增强:通过随机裁剪、翻转等方式增加训练数据。
  • 多 GPU 训练:使用两块 GPU 并行训练,加速训练过程。

AlexNet 的具体结构如下:

  1. 输入层:输入 224x224 RGB 图像。
  2. 卷积层 C1:96 个 11x11 卷积核,步长为 4,输出 96 个 55x55 特征图。
  3. 池化层 S2:3x3 最大池化,步长为 2,输出 96 个 27x27 特征图。
  4. 卷积层 C3:256 个 5x5 卷积核,输出 256 个 27x27 特征图。
  5. 池化层 S4:3x3 最大池化,步长为 2,输出 256 个 13x13 特征图。
  6. 卷积层 C5:384 个 3x3 卷积核,输出 384 个 13x13 特征图。
  7. 卷积层 C6:384 个 3x3 卷积核,输出 384 个 13x13 特征图。
  8. 卷积层 C7:256 个 3x3 卷积核,输出 256 个 13x13 特征图。
  9. 池化层 S8:3x3 最大池化,步长为 2,输出 256 个 6x6 特征图。
  10. 全连接层 F9:4096 个神经元,使用 Dropout 防止过拟合。
  11. 全连接层 F10:4096 个神经元,使用 Dropout 防止过拟合。
  12. 输出层:1000 个神经元,对应 ImageNet 的 1000 个类别。

3.2 TensorFlow 实现

  1. import tensorflow as tf
  2. from tensorflow.keras import layers, models
  3. # 构建 AlexNet 模型
  4. def AlexNet():
  5. model = models.Sequential()
  6. # 卷积层 C1
  7. model.add(layers.Conv2D(96, (11, 11), strides=(4, 4), activation='relu', input_shape=(224, 224, 3)))
  8. # 池化层 S2
  9. model.add(layers.MaxPooling2D((3, 3), strides=(2, 2)))
  10. # 卷积层 C3
  11. model.add(layers.Conv2D(256, (5, 5), padding='same', activation='relu'))
  12. # 池化层 S4
  13. model.add(layers.MaxPooling2D((3, 3), strides=(2, 2)))
  14. # 卷积层 C5
  15. model.add(layers.Conv2D(384, (3, 3), padding='same', activation='relu'))
  16. # 卷积层 C6
  17. model.add(layers.Conv2D(384, (3, 3), padding='same', activation='relu'))
  18. # 卷积层 C7
  19. model.add(layers.Conv2D(256, (3, 3), padding='same', activation='relu'))
  20. # 池化层 S8
  21. model.add(layers.MaxPooling2D((3, 3), strides=(2, 2)))
  22. # 展平
  23. model.add(layers.Flatten())
  24. # 全连接层 F9
  25. model.add(layers.Dense(4096, activation='relu'))
  26. model.add(layers.Dropout(0.5))
  27. # 全连接层 F10
  28. model.add(layers.Dense(4096, activation='relu'))
  29. model.add(layers.Dropout(0.5))
  30. # 输出层
  31. model.add(layers.Dense(1000, activation='softmax'))
  32. return model
  33. # 创建模型实例
  34. model = AlexNet()
  35. # 打印模型结构
  36. model.summary()

四、总结

LeNet 和 AlexNet 是卷积神经网络发展历程中的重要里程碑,LeNet 为 CNN 的基础架构奠定了基础,而 AlexNet 则开启了深度学习在计算机视觉领域的新纪元。通过 TensorFlow 等深度学习框架,我们可以方便地实现这些经典架构,并在此基础上进行改进和创新,以解决各种实际问题。随着技术的不断发展,后续还出现了许多更先进的 CNN 架构,如 VGG、GoogLeNet、ResNet 等,它们在性能和效率上都有了进一步的提升。

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