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