PyTorch入门教程:手把手教你搭建第一个神经网络模型

1. 引言

PyTorch是一个开源的Python机器学习库,尤其在深度学习领域广泛应用。它以其动态计算图、直观的语法和高效的性能著称,是初学者入门深度学习的绝佳选择。本文将通过一个完整的示例,带你一步步搭建第一个神经网络模型,从数据加载到模型训练,让你快速掌握PyTorch的核心操作。

2. 环境准备

在开始之前,请确保你已安装PyTorch。如果还未安装,可以通过以下命令安装(根据你的系统选择合适的版本):

# CPU版本
pip install torch torchvision

# GPU版本(需预先安装CUDA)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118/torch_stable.html

3. 数据准备:加载MNIST数据集

MNIST是一个经典的手写数字识别数据集,包含60000张训练图像和10000张测试图像,每张图像是28×28的灰度图。我们将使用PyTorch的torchvision库加载并预处理数据。

3.1 导入所需库

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

3.2 定义数据变换和加载器

# 数据变换:将图像转为张量并归一化
transform = transforms.Compose([
    transforms.ToTensor(),  # 转换为张量,像素值从0-255变为0-1
    transforms.Normalize((0.1307,), (0.3081,))  # 标准化(减去均值,除以标准差)
])

# 加载训练集和测试集
train_dataset = datasets.MNIST(
    root='./data', train=True, download=True, transform=transform
)
test_dataset = datasets.MNIST(
    root='./data', train=False, download=True, transform=transform
)

# 创建数据加载器(批量处理数据,打乱顺序)
batch_size = 64  # 每次训练的样本数
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

4. 定义神经网络模型

我们将构建一个简单的全连接神经网络(MLP),包含以下部分:
- 输入层:784个神经元(28×28的图像展平)
- 隐藏层:128个神经元(使用ReLU激活函数)
- 输出层:10个神经元(对应0-9的数字,使用Softmax激活)

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        # 定义全连接层:输入784,输出128
        self.fc1 = nn.Linear(28*28, 128)
        # 定义全连接层:输入128,输出10
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        # 前向传播:先展平图像,再通过全连接层和激活函数
        x = x.view(-1, 28*28)  # 展平图像,-1表示自动计算batch_size
        x = torch.relu(self.fc1(x))  # ReLU激活函数
        x = self.fc2(x)  # 输出层,无激活(CrossEntropyLoss会自动处理)
        return x

# 实例化模型
model = SimpleNN()

5. 定义损失函数和优化器

  • 损失函数:分类任务常用交叉熵损失(nn.CrossEntropyLoss),它会自动处理Softmax。
  • 优化器:使用随机梯度下降(SGD),学习率设为0.01。
criterion = nn.CrossEntropyLoss()  # 交叉熵损失
optimizer = optim.SGD(model.parameters(), lr=0.01)  # SGD优化器

6. 训练模型

训练过程分为以下步骤:
1. 遍历训练数据集(多个epoch)
2. 对每个batch数据,前向传播计算输出
3. 计算损失,反向传播计算梯度
4. 更新模型参数

epochs = 5  # 训练轮数

for epoch in range(epochs):
    model.train()  # 模型设为训练模式(启用Dropout/BatchNorm等)
    running_loss = 0.0

    for batch_idx, (data, target) in enumerate(train_loader):
        # 清零梯度
        optimizer.zero_grad()

        # 前向传播:计算模型输出
        outputs = model(data)

        # 计算损失
        loss = criterion(outputs, target)

        # 反向传播:计算梯度
        loss.backward()

        # 更新参数
        optimizer.step()

        # 累计损失
        running_loss += loss.item()

        # 每100个batch打印一次信息
        if batch_idx % 100 == 99:
            print(f'Epoch {epoch+1}, Batch {batch_idx+1}, Loss: {running_loss/100:.4f}')
            running_loss = 0.0

7. 测试模型

在测试集上验证模型性能,计算测试集准确率:

model.eval()  # 模型设为评估模式(禁用Dropout等)
correct = 0
total = 0

with torch.no_grad():  # 测试时不计算梯度,节省内存
    for data, target in test_loader:
        outputs = model(data)
        _, predicted = torch.max(outputs.data, 1)  # 获取预测类别
        total += target.size(0)
        correct += (predicted == target).sum().item()

print(f'Test Accuracy: {100 * correct / total:.2f}%')

8. 总结与扩展

通过本文,你已经完成了第一个PyTorch神经网络模型的搭建!主要步骤包括:
- 数据加载与预处理
- 模型定义(继承nn.Module,定义层和前向传播)
- 损失函数和优化器选择
- 训练循环(前向传播→损失计算→反向传播→参数更新)
- 测试验证(评估准确率)

可以尝试的扩展:

  • 调整隐藏层大小或层数(如增加更多隐藏层)
  • 更换优化器(如Adam、RMSprop)
  • 使用更复杂的数据集(如Fashion-MNIST)
  • 添加Dropout防止过拟合
  • 可视化训练过程中的损失和准确率变化

PyTorch的强大之处在于它的灵活性和易用性,通过不断实践,你将逐步掌握构建更复杂模型的能力!

小夜