# 第 8 章 卷积神经网络 CNN
# 本章概括
本章介绍 CNN 在图像任务中的基本结构,包括卷积层、池化层、ReLU、批归一化、经典网络 VGG 和 ResNet。重点是理解卷积如何提取局部特征,以及深层网络如何通过残差连接提高训练稳定性。
# 卷积神经网络概述
CNN 适合处理图像,因为它利用局部连接、权值共享和平移等变性。图像输入通常为 张量,卷积层提取局部特征,池化层降低分辨率,最后通过全连接层或全局池化完成分类。
# 卷积 Convolution
二维卷积输出可写为:
其中 是输入, 是卷积核, 是偏置。卷积核学习边缘、纹理、局部形状等特征。
卷积层常见参数:
in_channels:输入通道数,例如灰度图为 1,RGB 图为 3。out_channels:卷积核个数,也是输出特征图通道数。kernel_size:卷积核大小,如 或 。stride:步幅,越大输出尺寸越小。padding:边缘填充,用于控制输出尺寸并保留边界信息。
输出尺寸为:
其中 为输入尺寸, 为 padding, 为卷积核大小, 为 stride。
# 池化 Pooling
池化用于降低特征图尺寸并增强局部平移鲁棒性。最大池化保留局部最大响应,适合突出显著特征;平均池化保留局部平均信息,平滑性更强。
# ReLU 激活函数
ReLU 定义为:
它引入非线性,并缓解 sigmoid/tanh 的梯度饱和问题。负值被置零,正值保持不变。
# 批归一化 Batch Normalization
BN 对 mini-batch 中的特征进行归一化:
再通过可学习参数恢复表达能力:
BN 可稳定训练、加快收敛,并在一定程度上起到正则化作用。
# 经典 CNN 结构
# VGG
VGG 使用大量 卷积堆叠构建深层网络。小卷积核叠加可以扩大感受野,同时减少参数量并增加非线性层数。
# ResNet
ResNet 引入残差连接:
其中 是残差分支, 是捷径连接。残差连接让网络学习输入与输出之间的差值,缓解深层网络退化问题。
# 代码整理
这段代码用于加载预训练 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(),并配合损失函数和优化器更新参数。

