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

1次阅读
没有评论

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

image.webp

理解卷积的数学本质

想象用放大镜在图像上滑动检查细节——这就是卷积核的工作方式。2D 卷积的数学表达为:

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

$$(f * g)(i,j) = \sum_{m}\sum_{n} f(m,n) \cdot g(i-m,j-n)$$

其中 $f$ 是输入图像矩阵,$g$ 是卷积核。动图演示中可以看到,3×3 的卷积核在 5 ×5 输入上滑动时,输出特征图尺寸变为 3 ×3(无 padding 情况下)。

框架选择:PyTorch vs TensorFlow

  • PyTorch 优势
  • 动态计算图更直观调试
  • nn.Conv2d(in_channels, out_channels, kernel_size) 参数命名清晰
  • 与 Python 生态无缝集成

  • TensorFlow/Keras 特点

  • Conv2D(filters, kernel_size) 参数顺序不同
  • 静态图模式适合生产部署
  • Keras 的 ImageDataGenerator 内置数据增强

MNIST 分类实战

import torch
import torch.nn as nn

class CNN(nn.Module):
    def __init__(self):
        super().__init__()
        # 卷积层参数详解:# in_channels=1 (灰度图), out_channels=32 (特征图数量)
        # kernel_size=3, stride=1 (默认), padding=1 (保持尺寸)
        self.conv1 = nn.Conv2d(1, 32, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)  # kernel_size=2, stride=2
        self.fc = nn.Linear(32*14*14, 10)  # MNIST 最终 10 分类

    def forward(self, x):
        x = torch.relu(self.conv1(x))
        assert x.shape == (batch_size, 32, 28, 28)  # 维度校验
        x = self.pool(x)
        return self.fc(x.flatten(1))

性能优化关键点

  1. 计算效率对比
  2. 3×3 卷积的 FLOPs:$H \times W \times C_{in} \times C_{out} \times 9$
  3. 5×5 卷积的 FLOPs 是 3 ×3 的约 2.78 倍

  4. BatchNorm 的陷阱

    model.eval()  # 必须设置!否则推理时 BN 层仍用 batch 统计量
    with torch.no_grad():
        output = model(test_data)

新手避坑指南

  • 输入归一化

    # 未归一化的像素值 (0-255) 会导致梯度爆炸
    transform = transforms.Compose([transforms.ToTensor(),
        transforms.Normalize((0.5,), (0.5,))  # 缩放到[-1,1]
    ])

  • 池化层参数

  • stride > kernel_size 时会出现特征图遗漏
  • 建议保持stride <= kernel_size

拓展思考

  1. 1×1 卷积的妙用

    nn.Conv2d(256, 64, 1)  # 将通道数从 256 降到 64

  2. 转置卷积应用

    nn.ConvTranspose2d(64, 32, 4, stride=2, padding=1)  # 分辨率加倍

实践建议

建议先用小批量数据 (如 100 张图) 验证模型基础流程,再逐步增加数据量。学习率初始值可设为 0.01,配合 ReduceLROnPlateau 动态调整。遇到 loss 震荡时,尝试增加 BatchNorm 层或减小学习率。

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