卷积神经网络(Convolutional Neural Network, CNN)是深度学习领域中一种非常重要的模型架构,在图像识别、目标检测、语义分割等众多计算机视觉任务中取得了巨大的成功。从早期的开创性工作到如今复杂且高效的架构,CNN 经历了多个发展阶段,涌现出了许多经典的架构。本文将详细介绍其中的 LeNet 和 AlexNet 等经典架构,探讨它们的特点、创新点以及在深度学习发展历程中的重要意义。
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 的数字分类 |
import torch
import torch.nn as nn
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool = nn.AvgPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = self.pool(torch.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
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 个类别 |
import torch
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(256, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
LeNet 和 AlexNet 是卷积神经网络发展历程中的两个重要里程碑。LeNet 作为先驱,奠定了 CNN 的基本架构和思想,为后续的研究和应用提供了基础;而 AlexNet 则开启了深度学习在计算机视觉领域的新时代,通过引入一系列创新技术,使得 CNN 在大规模图像分类任务中取得了突破性的进展。随着时间的推移,越来越多的优秀 CNN 架构不断涌现,如 VGG、GoogLeNet、ResNet 等,但 LeNet 和 AlexNet 的贡献不可磨灭,它们的思想和技术仍然对当前的深度学习研究产生着深远的影响。