CNN卷积神经网络入门指南:从数学原理到PyTorch实战

1次阅读
没有评论

共计 1772 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

一、数学基础:理解卷积运算

卷积神经网络的数学本质是 离散卷积运算。对于输入图像 $I$(尺寸 $H×W$)和卷积核 $K$(尺寸 $k_h×k_w$),输出特征图 $O$ 的计算公式为:

CNN 卷积神经网络入门指南:从数学原理到 PyTorch 实战

$$ O(i,j) = \sum_{m=0}^{k_h-1}\sum_{n=0}^{k_w-1} I(i+m, j+n) \cdot K(m,n) $$

根据边界处理方式不同,有三种 padding 模式:

  • Valid 模式:不填充,输出尺寸为 $(H-k_h+1)×(W-k_w+1)$
  • Same 模式:填充使输出尺寸与输入相同,需满足 $pad=\lfloor k_h/2 \rfloor$
  • Full 模式:最大填充,输出尺寸为 $(H+k_h-1)×(W+k_w-1)$

二、网络架构解剖:LeNet- 5 实例

以经典 LeNet- 5 结构为例(输入 32×32 灰度图):

  1. Conv1:5×5 卷积,6 个通道(参数共享机制)
    nn.Conv2d(1, 6, kernel_size=5, stride=1)  # 输出 6×28×28
  2. Pool1:2×2 最大池化
    nn.MaxPool2d(kernel_size=2, stride=2)  # 输出 6×14×14
  3. Conv2:5×5 卷积,16 个通道
  4. FC 层:最终输出 10 类概率

感受野计算公式:$RF_{l+1} = RF_l + (k-1)×\prod_{i=1}^l s_i$

三、PyTorch 实战代码

完整 CNN 类实现:

import torch.nn as nn

class LeNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.features = nn.Sequential(nn.Conv2d(3, 6, 5),      # CIFAR-10 有 3 通道
            nn.ReLU(),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(6, 16, 5),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        self.classifier = nn.Sequential(nn.Linear(16*5*5, 120),
            nn.ReLU(),
            nn.Linear(120, 84),
            nn.ReLU(),
            nn.Linear(84, 10)
        )

    def forward(self, x):
        x = self.features(x)  # B×3×32×32 → B×16×5×5
        x = torch.flatten(x, 1)
        return self.classifier(x)

四、训练技巧与调试

  1. 参数量统计:

    from torchsummary import summary
    model = LeNet().to('cuda')
    summary(model, (3, 32, 32))  # 显示各层参数

  2. 学习率衰减策略:

    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
    scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=200)

  3. TensorBoard 监控:

    from torch.utils.tensorboard import SummaryWriter
    writer = SummaryWriter()
    # 在训练循环中添加:writer.add_scalar('Loss/train', loss.item(), epoch)
    writer.add_scalar('Accuracy/test', accuracy, epoch)

五、常见问题解决方案

  • 输入尺寸不匹配:检查数据预处理是否统一为 32×32
  • 模型模式混淆:训练前调用model.train(),验证时调用model.eval()
  • 梯度爆炸:添加梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
  • 过拟合:使用 Dropout 层或数据增强

六、CIFAR-10 实战结果

经过 200 轮训练后:

  • 训练准确率:89.2%
  • 测试准确率:85.7%

关键改进点:
1. 添加 BatchNorm 层加速收敛
2. 使用 Adam 优化器替代 SGD
3. 采用随机水平翻转数据增强

完整训练代码可在 Colab Notebook 中运行,建议读者尝试调整超参数观察效果变化。通过本实践,相信你已掌握 CNN 的核心实现逻辑,接下来可以挑战更复杂的 ResNet 等现代架构。

正文完
 0
评论(没有评论)