11.1 LeNet
在深度学习的发展史上,LeNet(又称LeNet-5)是一个里程碑式的模型。
它由深度学习先驱Yann LeCun等人于1998年提出,被公认为第一个成功应用的卷积神经网络。尽管在LeNet之前已有类似卷积结构的研究,但LeNet首次将卷积、池化和反向传播结合,为现代计算机视觉奠定了基础。
11.1.1 网络结构
Input: 1×32×32 图像(如手写数字)
C1: 卷积层,6个5×5卷积核 → 输出6×28×28
S2: 平均池化层 → 输出6×14×14
C3: 卷积层,16个5×5卷积核 → 输出16×10×10
S4: 平均池化层 → 输出16×5×5
C5: 卷积层,120个5×5卷积核 → 输出120×1×1(相当于全连接)
F6: 全连接层,输出84个神经元
Output: 全连接层,输出10类(数字0-9的概率)
注意: 输入为32×32图像(MNIST是28×28,用zero-padding补足) 使用平均池化(Average Pooling)而非现代常见的最大池化(Max Pooling) 激活函数为Sigmoid或tanh,而非ReLU
11.1.2 LeNet的实现
import torch
import torch.nn as nn
import torch.nn.functional as F
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
# C1: 输入1通道,输出6通道,卷积核5x5
self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
# S2: 平均池化层
self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)
# C3: 输入6通道,输出16通道
self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
# S4: 平均池化
self.pool2 = nn.AvgPool2d(kernel_size=2, stride=2)
# C5: 全连接等价层(输入16×5×5 -> 输出120)
self.conv3 = nn.Conv2d(16, 120, kernel_size=5)
# F6: 全连接层
self.fc1 = nn.Linear(120, 84)
# Output: 输出10类
self.fc2 = nn.Linear(84, 10)
def forward(self, x):
x = F.tanh(self.conv1(x)) # C1 + 激活
x = self.pool1(x) # S2
x = F.tanh(self.conv2(x)) # C3 + 激活
x = self.pool2(x) # S4
x = F.tanh(self.conv3(x)) # C5 + 激活
x = x.view(-1, 120) # 展平
x = F.tanh(self.fc1(x)) # F6
x = self.fc2(x) # 输出层
return x
11.1.3 LeNet的意义
LeNet 最初是为美国邮政局开发,用于识别手写邮政编码,是卷积神经网络(CNN)首次成功应用于现实世界问题。它在标准的 MNIST 数据集上取得了超过 99.2% 的准确率,远超当时的传统算法。与依赖人工特征设计的方法不同,LeNet 能通过卷积核自动学习图像特征,省去了手动构造特征的繁琐过程。它结构简单、效率高、准确率高,堪称 CNN 发展史上的里程碑。LeNet-5 首次系统性地引入了 Padding、卷积、池化和全连接等关键结构,这些核心思想至今仍是现代深度学习网络设计的基础。