《深度学习实战》第2集:卷积神经网络(CNN)与图像分类
引言
卷积神经网络(Convolutional Neural Network, CNN)是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer,CNN 的发展推动了图像分类、目标检测和语义分割等任务的突破。在本集中,我们将深入探讨 CNN 的基本原理,回顾经典架构的发展历程,并通过实战项目使用 ResNet 实现 CIFAR-10 图像分类任务。最后,我们还将探讨大模型中的视觉架构,如 Vision Transformer (ViT),展望未来的技术趋势。
一、卷积神经网络的基本原理
1.1 卷积层
卷积层是 CNN 的核心组件,负责提取图像的空间特征。卷积操作通过对输入图像应用滤波器(Filter),生成特征图(Feature Map)。
- 作用:捕捉局部特征(如边缘、纹理)。
- 公式:
卷积层示意图:
图 1: 卷积操作示意图
1.2 池化层
池化层用于降维,减少计算量并增强模型的鲁棒性。常见的池化操作包括:
- 最大池化(Max Pooling):取局部区域的最大值。
- 平均池化(Average Pooling):取局部区域的平均值。
池化层示意图:
图 2: 最大池化操作示意图
1.3 批归一化(Batch Normalization)
批归一化通过对每一批数据进行标准化处理,加速训练并提高模型稳定性。
- 作用:缓解梯度消失问题,提升收敛速度。
- 公式:
二、经典 CNN 架构
2.1 LeNet
LeNet 是最早的 CNN 架构之一,由 Yann LeCun 提出,主要用于手写数字识别。
- 特点:包含卷积层、池化层和全连接层。
- 应用:MNIST 数据集。
LeNet 结构图:
图 3: LeNet 架构图
2.2 AlexNet
AlexNet 在 2012 年 ImageNet 竞赛中取得突破性成绩,标志着深度学习时代的到来。
- 特点:引入 ReLU 激活函数、Dropout 和 GPU 加速。
- 创新点:首次使用多层卷积网络。
AlexNet 结构图:
图 4: AlexNet 架构图
2.3 VGG
VGG 以简单的结构和强大的性能著称,通过堆叠多个 3x3 卷积核实现深层网络。
- 特点:统一使用 3x3 卷积核,参数量较大。
- 应用:ImageNet、迁移学习。
VGG 结构图:
图 5: VGG 架构图
2.4 ResNet
ResNet 引入残差连接(Residual Connection),解决了深层网络中的梯度消失问题。
- 特点:通过跳跃连接(Skip Connection)实现信息流动。
- 创新点:支持训练超过 100 层的网络。
ResNet 结构图:
图 6: ResNet 残差块结构图
三、实战项目:使用 ResNet 实现 CIFAR-10 图像分类
3.1 数据集介绍
CIFAR-10 数据集包含 10 类彩色图像(如飞机、汽车、猫等),每类 6,000 张图片,其中 50,000 张用于训练,10,000 张用于测试。
CIFAR-10 样例:
图 7: CIFAR-10 数据集样例
3.2 使用 PyTorch 实现
以下代码展示了如何使用预训练的 ResNet 模型对 CIFAR-10 进行微调。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models# 数据预处理
transform = transforms.Compose([transforms.Resize(224),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])train_dataset = datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=transform)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)# 加载预训练的 ResNet 模型
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10) # 修改最后一层以适应 CIFAR-10 的 10 类# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)for epoch in range(5):model.train()running_loss = 0.0for images, labels in train_loader:images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}")# 测试模型
model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Test Accuracy: {correct / total:.4f}")
程序运行后输出:
Epoch 1, Loss: 0.5615
Epoch 2, Loss: 0.3187
Epoch 3, Loss: 0.2207
Epoch 4, Loss: 0.1634
Epoch 5, Loss: 0.1233
Test Accuracy: 0.9017
可以看到五个批次训练后,最终的精确率是90.17%.
模型选择:为什么选择 PyTorch 而不是 TensorFlow
在本实战项目中,我们选择了 PyTorch 作为实现 ResNet 的框架。以下是详细的原因分析和对比:
1. 动态计算图 vs 静态计算图
- PyTorch 使用动态计算图(Dynamic Computation Graph),允许开发者在运行时动态构建网络结构。这种灵活性非常适合研究和实验,尤其是在需要调试或修改模型结构时。
- TensorFlow 在早期版本中主要依赖静态计算图(Static Computation Graph),虽然从 TensorFlow 2.x 开始引入了 Eager Execution 模式以支持动态图,但其底层仍保留了静态图的复杂性,可能增加学习成本。
优势:PyTorch 的动态图设计使得代码更加直观,易于理解和调试,特别适合初学者和研究人员。
2. 社区与生态系统
- PyTorch 的社区活跃度近年来迅速增长,尤其在学术界备受青睐。许多最新的深度学习研究成果(如 Vision Transformer、Diffusion Models)都优先提供 PyTorch 实现。
- TensorFlow 的生态系统更加成熟,特别是在工业部署领域具有明显优势,但在研究领域的创新速度相对较慢。
优势:对于本项目中的图像分类任务,PyTorch 提供了更丰富的预训练模型(如 torchvision.models
),并且社区资源丰富,便于快速实现和验证。
3. 易用性与代码简洁性
- PyTorch 的 API 设计更加 Pythonic,代码风格接近原生 Python,降低了学习门槛。例如,在定义模型时,PyTorch 使用类继承的方式(
nn.Module
),逻辑清晰且易于扩展。 - TensorFlow 的 Keras API 虽然提供了高层次封装,但在某些场景下可能显得不够灵活,尤其是当需要自定义层或损失函数时。
优势:PyTorch 的代码更加简洁直观,适合快速原型开发和教学。
4. 性能与硬件支持
- PyTorch 和 TensorFlow 在性能上基本相当,但在 GPU 加速方面,PyTorch 对 CUDA 的支持更为直接,开发者可以轻松利用 GPU 进行加速。
- TensorFlow 提供了对 TPU 的原生支持,这在大规模分布式训练中是一个显著优势,但对于中小型项目(如 CIFAR-10 分类),TPU 的优势并不明显。
优势:对于本项目,PyTorch 的 GPU 支持已经足够满足需求,且配置简单。
5. 可视化工具
- TensorFlow 提供了强大的可视化工具 TensorBoard,能够实时监控训练过程、绘制损失曲线和可视化模型结构。
- PyTorch 的可视化工具相对较少,但可以通过第三方库(如 TensorBoardX 或内置的
torch.utils.tensorboard
)实现类似功能。
劣势:PyTorch 在可视化方面稍逊于 TensorFlow,但对于本项目来说,这一差距并不影响核心任务的完成。
综合以上分析,我们选择 PyTorch 的主要原因在于其动态计算图的灵活性、Pythonic 的代码风格以及丰富的研究社区支持。尽管 TensorFlow 在工业部署和分布式训练方面具有优势,但对于本项目的图像分类任务,PyTorch 更加适合快速实现和迭代。如果你对 TensorFlow 的实现感兴趣,也可以尝试使用 Keras API 构建类似的 ResNet 模型,体验两种框架的不同之处!
四、前沿关联:大模型中的视觉架构(Vision Transformer, ViT)
随着 Transformer 在自然语言处理中的成功,研究者将其引入计算机视觉领域,提出了 Vision Transformer (ViT)。
- 特点:
- 将图像分割为固定大小的 Patch,作为输入序列。
- 使用自注意力机制捕捉全局依赖关系。
- 优势:
- 在大规模数据集上表现优异。
- 可扩展性强,适合超大规模模型。
ViT 结构图:
图 8: Vision Transformer 架构图
总结
本集详细介绍了卷积神经网络的基本原理和经典架构,并通过实战项目展示了如何使用 ResNet 实现 CIFAR-10 图像分类任务。最后,我们探讨了 Vision Transformer 的前沿技术,展望了计算机视觉的未来方向。
希望这篇文章能为你提供清晰的学习路径!如果你有任何问题或想法,欢迎在评论区留言讨论。
附图:
- 图 1: 卷积层示意图
- 图 2: 池化层示意图
- 图 3: LeNet 架构图
- 图 4: AlexNet 架构图
- 图 5: VGG 架构图
- 图 6: ResNet 残差块结构图
- 图 7: CIFAR-10 数据集样例
- 图 8: Vision Transformer 架构图
下集预告:第3集将聚焦于循环神经网络(RNN)与序列建模任务,带你深入了解 LSTM 和 GRU 的改进及其在时间序列预测中的应用。