LeNet-5详解

LeNet-5 是卷积神经网络(CNN)的开山之作,由 Yann LeCun 团队于1998年提出,最初用于手写数字识别(MNIST数据集)。以下是其详细解析:


1. 网络结构

LeNet-5 由 7层 组成(不含输入层),包含 2个卷积层2个池化层3个全连接层
以下是经典结构(输入为32×32灰度图像):

层类型 参数说明 输出尺寸
输入层 32×32×1(MNIST图像被填充至32×32) 32×32×1
卷积层C1 6个5×5卷积核,步长1,无填充 28×28×6
池化层S2 2×2平均池化,步长2 14×14×6
卷积层C3 16个5×5卷积核,步长1,无填充 10×10×16
池化层S4 2×2平均池化,步长2 5×5×16
全连接层 展平为400维,连接120个神经元 120
全连接层 120 → 84神经元 84
输出层 84 → 10神经元(对应数字0-9) 10

2. 核心设计特点

  1. 卷积与池化交替

    • 使用 5×5卷积核 提取局部特征,后接 2×2平均池化(当时未使用最大池化)。
    • 逐步降低空间分辨率,增加通道数(特征深度)。
  2. 激活函数

    • 使用 TanhSigmoid(当时ReLU尚未普及),存在梯度消失问题。
  3. 参数共享与局部感受野

    • 卷积核在图像上滑动,共享参数,减少计算量。
    • 通过局部感受野捕捉平移不变性。
  4. 全连接层分类

    • 最后将特征展平,通过全连接层输出类别概率(Softmax)。

3. 关键细节

  • C3卷积层的特殊连接
    C3的16个通道并非全部连接S2的6个通道,而是采用部分连接减少参数量并强制学习组合特征。

  • 输出层
    使用 径向基函数(RBF) 作为损失(现多改用Softmax + 交叉熵)。


4. 与现代CNN的对比

特性 LeNet-5(1998) 现代CNN(如ResNet)
激活函数 Tanh/Sigmoid ReLU/LeakyReLU/Swish
池化方式 平均池化 最大池化/自适应池化
正则化 Dropout/BatchNorm
深度 7层(浅层) 数十至数百层(残差连接)
输入尺寸 32×32(小分辨率) 224×224或更大

5. 代码实现(PyTorch示例)

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, 5)
        # 卷积层C3:输入6通道,输出16通道,5x5卷积核
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 全连接层F5:16*5*5输入,120输出
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        # 全连接层F6:120输入,84输出
        self.fc2 = nn.Linear(120, 84)
        # 输出层:84输入,10输出(对应10个类别)
        self.fc3 = nn.Linear(84, 10)
        
    def forward(self, x):
        # C1卷积 -> S2池化
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # C3卷积 -> S4池化
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        # 展平特征图
        x = x.view(-1, self.num_flat_features(x))
        # F5全连接
        x = F.relu(self.fc1(x))
        # F6全连接
        x = F.relu(self.fc2(x))
        # 输出层
        x = self.fc3(x)
        return x
        
    def num_flat_features(self, x):
        size = x.size()[1:]  # 获取除batch维度外的其他维度
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

# 创建网络实例
net = LeNet()
print(net)

6. 历史意义与局限性

  • 意义

    • 首次证明CNN在视觉任务中的有效性。
    • 奠定了“卷积→池化→全连接”的基础架构。
  • 局限性

    • 浅层网络难以处理复杂数据(如ImageNet)。
    • 使用Tanh/Sigmoid导致梯度消失,训练效率低。

总结

LeNet-5 是CNN的起点,虽然结构简单,但设计思想(局部感受野、权值共享、层次化特征)影响了后续所有现代CNN模型。理解LeNet-5是学习深度学习历史的必修课!

你可能感兴趣的:(cnn,人工智能,神经网络)