PyTorch入门实战:从零搭建你的第一个神经网络
目录
一、PyTorch简介:为什么选择它?
二、环境搭建:5分钟快速安装
三、核心概念:张量与自动求导
1. 张量(Tensor):深度学习的数据基石
2. 自动求导(Autograd):神经网络训练的核心
四、实战:手写数字识别(MNIST)
1. 数据集加载与预处理
2. 构建卷积神经网络(CNN)
3. 训练与评估
五、下一步学习建议
一、PyTorch简介:为什么选择它?
PyTorch是当前最热门的深度学习框架之一,由Facebook AI Research(FAIR)开发并开源。其核心优势在于:
-
动态计算图:实时调试更灵活,适合科研与快速迭代。
-
Python友好:代码简洁如“伪代码”,学习成本低。
-
生态丰富:支持预训练模型库(如TorchVision、Hugging Face),社区活跃。
二、环境搭建:5分钟快速安装
步骤1:安装Python
推荐使用Python 3.8+版本(官网下载)。
步骤2:安装PyTorch
打开终端,根据系统选择以下命令(以CPU版本为例):
# Windows/Linux通用命令
pip install torch torchvision torchaudio
注:如需GPU加速,请访问PyTorch官网生成CUDA版本安装命令。
验证安装:
import torch
print("PyTorch版本:", torch.__version__) # 输出示例:2.0.1
print("GPU是否可用:", torch.cuda.is_available()) # 输出示例:False(若未安装GPU驱动)
三、核心概念:张量与自动求导
1. 张量(Tensor):深度学习的数据基石
张量是多维数组的扩展,支持GPU加速运算。
基础操作示例:
import torch
# 创建张量
a = torch.tensor([[1, 2], [3, 4]]) # 2x2矩阵
b = torch.tensor([[5, 6], [7, 8]])
# 加法
c = a + b
print("加法结果:\n", c)
# 输出:
# tensor([[ 6, 8],
# [10, 12]])
# 矩阵乘法
d = torch.matmul(a, b)
print("矩阵乘法结果:\n", d)
# 输出:
# tensor([[19, 22],
# [43, 50]])
2. 自动求导(Autograd):神经网络训练的核心
PyTorch通过autograd
自动计算梯度,极大简化反向传播过程。
示例:计算函数梯度
x = torch.tensor(3.0, requires_grad=True) # 启用梯度追踪
y = x**2 + 2*x + 1 # 定义函数 y = x² + 2x + 1
y.backward() # 反向传播计算梯度
print("x的梯度:", x.grad) # dy/dx = 2x + 2 → 当x=3时梯度为8.0
四、实战:手写数字识别(MNIST)
1. 数据集加载与预处理
import torch
from torchvision import datasets, transforms
# 定义数据转换
transform = transforms.Compose([
transforms.ToTensor(), # 将图像转为张量
transforms.Normalize((0.1307,), (0.3081,)) # 标准化
])
# 加载MNIST数据集
train_dataset = datasets.MNIST(
root='./data',
train=True,
download=True,
transform=transform
)
test_dataset = datasets.MNIST(
root='./data',
train=False,
download=True,
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)
2. 构建卷积神经网络(CNN)
import torch.nn as nn
import torch.nn.functional as F
class MNIST_CNN(nn.Module):
def __init__(self):
super(MNIST_CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3) # 输入通道1,输出通道32
self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
self.fc1 = nn.Linear(1600, 128) # 全连接层
self.fc2 = nn.Linear(128, 10) # 输出层(10类)
def forward(self, x):
x = F.relu(self.conv1(x)) # 激活函数
x = F.max_pool2d(x, 2) # 最大池化
x = F.relu(self.conv2(x))
x = F.max_pool2d(x, 2)
x = x.view(-1, 1600) # 展平张量
x = F.relu(self.fc1(x))
x = self.fc2(x)
return F.log_softmax(x, dim=1) # 输出概率分布
model = MNIST_CNN()
print(model)
3. 训练与评估
import torch.optim as optim
# 定义损失函数与优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练循环
def train(epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print(f'Epoch {epoch} | Batch {batch_idx} | Loss: {loss.item():.4f}')
# 测试循环
def test():
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
output = model(data)
test_loss += criterion(output, target).item()
pred = output.argmax(dim=1)
correct += pred.eq(target).sum().item()
test_loss /= len(test_loader.dataset)
accuracy = 100. * correct / len(test_loader.dataset)
print(f'测试集平均损失: {test_loss:.4f}, 准确率: {accuracy:.2f}%')
# 训练5个Epoch
for epoch in range(1, 6):
train(epoch)
test()
运行该段代码即可得到每次训练的测试集平均损失和准确率。
五、下一步学习建议
1、深入模型优化:学习使用学习率调度器(torch.optim.lr_scheduler
)、数据增强(torchvision.transforms
)。
2、探索预训练模型:用TorchVision加载ResNet、VGG等模型进行迁移学习。
3、部署实战:将模型导出为ONNX格式,或使用TorchScript实现生产环境部署。
互动话题:
你在使用PyTorch时遇到过哪些问题?欢迎在评论区留言讨论!
资源推荐:
-
PyTorch官方教程
-
《动手学深度学习》(PyTorch版)
一句话总结:
“PyTorch让深度学习触手可及——从张量到模型,开启你的AI探索之旅!”