本文将展示如何使用 PyTorch 实现一个经典的 VGGNet 网络,并在 MNIST 数据集上进行训练和测试。我们将从模型构建开始,涵盖数据预处理、模型训练、评估、保存与加载模型,以及可视化预测结果等全过程。
1. VGGNet 模型的实现
首先,我们实现一个标准的 VGGNet 网络。VGGNet 是一个深度卷积神经网络,它由多个卷积层和全连接层组成,广泛应用于图像分类任务。
VGGNet 模型结构:
- 卷积层:VGGNet 采用了简单的结构,使用多个卷积层,每层卷积后跟一个 ReLU 激活函数和一个 最大池化 层。
- 全连接层:经过卷积层提取特征后,VGGNet 会将特征图展平,并通过全连接层进行分类。
import torch.nn as nn
class VGG(nn.Module):
def __init__(self, num_classes=10, input_channels=1):
"""
VGG 网络的初始化方法,包含卷积层和全连接层。
参数:
- num_classes (int): 分类的类别数量,默认 10 (适用于 MNIST)
- input_channels (int): 输入图片的通道数,默认 1 (适用于灰度图像)
"""
super(VGG, self).__init__()
# 构建卷积层部分
self.features = self._make_layers(input_channels)
# 构建分类器部分
self.classifier = self._make_classifier(num_classes)
def _make_layers(self, input_channels):
"""
构建卷积层部分,通过堆叠卷积层、ReLU 激活和池化层来构建特征提取部分
参数:
- input_channels (int): 输入图像的通道数,默认为 1(灰度图)
返回:
- features (nn.Sequential): 包含卷积层和池化层的神经网络模块
"""
layers = []
# 卷积块 1
layers += self._conv_block(input_channels, 64)
# 卷积块 2
layers += self._conv_block(64, 128)
# 卷积块 3
layers += self._conv_block(128, 256)
# 卷积块 4
layers += self._conv_block(256, 512)
# 将所有卷积块和池化层堆叠在一起
return nn.Sequential(*layers)
def _conv_block(self, in_channels, out_channels):
"""
创建一个卷积块,包含两个卷积层和一个最大池化层
参数: