PyTorch 基础
PyTorch 基础
本节介绍 PyTorch 的核心概念和基础操作,适合初学者快速上手。内容涵盖张量(Tensor)、自动求导(Autograd)、基本神经网络构建和数据处理。以下是简明教程,代码示例简洁且可运行。
1. 张量(Tensor)
张量是 PyTorch 的核心数据结构,类似 NumPy 数组,但支持 GPU 加速和自动求导。
创建张量
import torch
# 基本张量
x = torch.tensor([1, 2, 3]) # 1D 张量
y = torch.zeros(2, 3) # 2x3 全零张量
z = torch.randn(3, 4) # 3x4 随机张量(正态分布)
# 从 NumPy 转换
import numpy as np
np_array = np.array([[1, 2], [3, 4]])
tensor_from_np = torch.from_numpy(np_array)
print(x, y, z)
张量操作
# 基本运算
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(a + b) # 元素相加: [5, 7, 9]
print(torch.matmul(a, b)) # 点积: 32
# 形状操作
x = torch.randn(2, 3)
print(x.view(3, 2)) # 重塑为 3x2
print(x.unsqueeze(0).shape) # 增加维度: [1, 2, 3]
print(x.squeeze().shape) # 移除单一维度
# 移动到 GPU
if torch.cuda.is_available():
x = x.to('cuda')
- 关键点:
- 张量支持广播(broadcasting),类似 NumPy。
- 使用
.to('cuda')
或.to('cpu')
切换设备。
2. 自动求导(Autograd)
PyTorch 的 autograd
模块自动计算梯度,是深度学习的核心。
示例:计算梯度
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x ** 2 # 定义运算
z = y.sum() # 标量输出
z.backward() # 计算梯度
print(x.grad) # 输出梯度: [4.0, 6.0] (dy/dx = 2x)
- 关键点:
requires_grad=True
:启用梯度跟踪。backward()
:计算梯度,存储在.grad
中。torch.no_grad()
:在推理时禁用梯度计算以节省内存。
3. 构建简单神经网络
使用 torch.nn
模块快速定义神经网络。
示例:全连接网络
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(10, 5) # 输入 10 维,输出 5 维
self.relu = nn.ReLU()
self.fc2 = nn.Linear(5, 2) # 输出 2 维
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
model = SimpleNN()
print(model)
- 说明:
- 继承
nn.Module
定义模型。 forward
方法定义前向传播。- 使用
nn.Linear
、nn.ReLU
等模块构建层。
4. 数据加载
PyTorch 的 torch.utils.data
模块简化数据处理。
示例:创建数据集
from torch.utils.data import DataLoader, TensorDataset
# 模拟数据
X = torch.randn(100, 10) # 100 个样本,10 维特征
y = torch.randint(0, 2, (100,)) # 0 或 1 的标签
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=32, shuffle=True)
# 访问数据
for data, target in loader:
print(data.shape, target.shape) # [32, 10], [32]
break
5. 训练模型
以下是训练神经网络的基本流程。
示例:训练分类模型
import torch.optim as optim
# 初始化
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练循环
for epoch in range(5):
for data, target in loader:
optimizer.zero_grad() # 清零梯度
output = model(data) # 前向传播
loss = criterion(output, target) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数
print(f"Epoch {epoch+1}, Loss: {loss.item()}")
6. 使用 GPU
将模型和数据移到 GPU 加速计算:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
data, target = data.to(device), target.to(device)
7. 关键模块
torch
: 核心模块,包含张量操作和数学函数。torch.nn
: 提供神经网络层(如nn.Linear
、nn.Conv2d
)和损失函数。torch.optim
: 优化器(如SGD
、Adam
)。torchvision
: 提供计算机视觉数据集、模型和变换。
8. 调试与可视化
- 打印张量:
print(tensor)
查看值和形状。 - 检查梯度:
model.parameters()
或tensor.grad
。 - 可视化损失:记录
loss.item()
,可用 Matplotlib 绘制(需要时可提供代码)。
9. 资源
- 官方文档:https://pytorch.org/docs/stable/index.html
- 教程:https://pytorch.org/tutorials/
- 社区:在 X 平台搜索 #PyTorch 获取最新讨论。
如果你需要更深入的讲解(例如,特定张量操作、卷积网络、数据增强)或代码示例,请告诉我!也可以生成损失曲线等图表。