# 第 8 章 卷积神经网络 CNN

# 本章概括

本章介绍 CNN 在图像任务中的基本结构,包括卷积层、池化层、ReLU、批归一化、经典网络 VGG 和 ResNet。重点是理解卷积如何提取局部特征,以及深层网络如何通过残差连接提高训练稳定性。

# 卷积神经网络概述

CNN 适合处理图像,因为它利用局部连接、权值共享和平移等变性。图像输入通常为 H×W×CH\times W\times C 张量,卷积层提取局部特征,池化层降低分辨率,最后通过全连接层或全局池化完成分类。

# 卷积 Convolution

二维卷积输出可写为:

y(i,j)=mnx(i+m,j+n)w(m,n)+by(i,j)=\sum_m\sum_n x(i+m,j+n)w(m,n)+b

其中 xx 是输入,ww 是卷积核,bb 是偏置。卷积核学习边缘、纹理、局部形状等特征。

卷积层常见参数:

  • in_channels:输入通道数,例如灰度图为 1,RGB 图为 3。
  • out_channels:卷积核个数,也是输出特征图通道数。
  • kernel_size:卷积核大小,如 3×33\times35×55\times5
  • stride:步幅,越大输出尺寸越小。
  • padding:边缘填充,用于控制输出尺寸并保留边界信息。

输出尺寸为:

Hout=H+2PKS+1H_{out}=\left\lfloor\frac{H+2P-K}{S}\right\rfloor+1

其中 HH 为输入尺寸,PP 为 padding,KK 为卷积核大小,SS 为 stride。

# 池化 Pooling

池化用于降低特征图尺寸并增强局部平移鲁棒性。最大池化保留局部最大响应,适合突出显著特征;平均池化保留局部平均信息,平滑性更强。

# ReLU 激活函数

ReLU 定义为:

ReLU(x)=max(0,x)\operatorname{ReLU}(x)=\max(0,x)

它引入非线性,并缓解 sigmoid/tanh 的梯度饱和问题。负值被置零,正值保持不变。

# 批归一化 Batch Normalization

BN 对 mini-batch 中的特征进行归一化:

x^=xμBσB2+ϵ\hat{x}=\frac{x-\mu_B}{\sqrt{\sigma_B^2+\epsilon}}

再通过可学习参数恢复表达能力:

y=γx^+βy=\gamma\hat{x}+\beta

BN 可稳定训练、加快收敛,并在一定程度上起到正则化作用。

# 经典 CNN 结构

# VGG

VGG 使用大量 3×33\times3 卷积堆叠构建深层网络。小卷积核叠加可以扩大感受野,同时减少参数量并增加非线性层数。

# ResNet

ResNet 引入残差连接:

y=F(x)+xy=F(x)+x

其中 F(x)F(x) 是残差分支,xx 是捷径连接。残差连接让网络学习输入与输出之间的差值,缓解深层网络退化问题。

# 代码整理

这段代码用于加载预训练 ResNet50,并自动选择 GPU 或 CPU。

import torch
from torchvision import models

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = models.resnet50(pretrained=True).to(device)
model.eval()

torch.device() 用于选择运行设备;models.resnet50(pretrained=True) 加载在大规模数据集上预训练的模型;.to(device) 把模型移动到 GPU 或 CPU。若改为训练模式,需要调用 model.train(),并配合损失函数和优化器更新参数。