共计 2080 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要 CNN?
在计算机视觉任务中,传统的全连接神经网络(如多层感知机)面临两个主要问题:

- 参数量爆炸 :处理一张 100×100 像素的 RGB 图像,输入层就需要 3 万个节点(100x100x3),导致第一层全连接层的参数量就高达数百万
- 平移不变性缺失 :全连接网络难以识别经过平移、旋转的相同物体
CNN 通过局部连接和权值共享完美解决了这些问题:
- 卷积核在图像上滑动计算,大幅减少参数量
- 同一卷积核能检测不同位置的相同特征
- 层级结构自动学习从边缘到物体的多层次特征
CNN 核心组件详解
1. 卷积层(Convolution Layer)
- 核心作用 :提取局部特征(如边缘、纹理)
- 关键参数 :
- kernel_size:卷积核尺寸(常用 3 ×3 或 5 ×5)
- stride:滑动步长(通常为 1 或 2)
- padding:边缘填充(保持特征图尺寸)
- in_channels/out_channels:输入 / 输出通道数
# PyTorch 实现示例
conv = nn.Conv2d(
in_channels=3, # 输入通道数(RGB 图像为 3)out_channels=16, # 输出通道数(即卷积核数量)kernel_size=3, # 3x3 卷积核
stride=1, # 步长 1
padding=1 # 保持尺寸不变
)
2. 池化层(Pooling Layer)
- 最大池化 :取窗口内最大值,保留显著特征
- 平均池化 :取窗口内平均值,平滑特征
- 作用 :
- 降维减少计算量
- 增强平移不变性
- 扩大感受野
pool = nn.MaxPool2d(kernel_size=2, stride=2) # 常用 2x2 窗口,步长 2
3. 全连接层(Fully Connected Layer)
- 位于网络末端
- 将特征图展平后连接
- 输出层使用 Softmax 实现分类
实战:CIFAR-10 图像分类
数据预处理
from torchvision import transforms
transform = transforms.Compose([transforms.ToTensor(), # 转为 Tensor
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 归一化
])
# 加载 CIFAR-10 数据集
trainset = torchvision.datasets.CIFAR10(
root='./data',
train=True,
download=True,
transform=transform
)
网络架构设计
class SimpleCNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.fc1 = nn.Linear(64 * 8 * 8, 512) # CIFAR-10 经过两次池化后是 8x8
self.fc2 = nn.Linear(512, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = torch.flatten(x, 1) # 展平
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
训练循环
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
for images, labels in trainloader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
避坑指南
- 输入尺寸错误 :
- 确保数据预处理后的尺寸与网络第一层匹配
-
常见错误:忘记归一化或归一化参数不一致
-
梯度消失 / 爆炸 :
- 使用 ReLU 等激活函数
-
合理初始化权重(如 He 初始化)
-
过拟合问题 :
- 添加 Dropout 层(如
nn.Dropout(0.5)) - 使用数据增强:
transforms.RandomHorizontalFlip(), transforms.RandomRotation(10)
拓展思考
尝试修改网络结构:
– 增加卷积层深度
– 尝试不同卷积核尺寸
– 添加 Batch Normalization 层
如何将本模型应用到:
– 人脸识别(修改输出层)
– 目标检测(结合区域提议)
– 图像分割(改为全卷积网络)
学习资源推荐
- PyTorch 官方教程
- 《Deep Learning with PyTorch》
- CS231n 卷积神经网络课程
通过这个实战项目,你应该已经掌握了 CNN 的基本原理和实现方法。接下来可以尝试在更复杂的数据集(如 ImageNet)上实践,或者探索现代网络架构如 ResNet、EfficientNet 等。
正文完
发表至: 未分类
四天前
