一、Pytorch简介与安装¶
Pytorch是一个基于Python的科学计算库,尤其擅长深度学习任务。它的优势在于动态计算图,这让模型调试更直观,代码更易读,非常适合初学者上手。
安装命令很简单:
pip install torch
安装完成后,我们可以通过import torch验证是否成功。
二、Pytorch基础:张量(Tensor)¶
张量是Pytorch的核心数据结构,类似于NumPy数组,但支持GPU加速。
1. 创建张量¶
import torch
# 创建1D张量
x = torch.tensor([1, 2, 3])
print(x) # 输出: tensor([1, 2, 3])
# 创建2D张量(矩阵)
y = torch.tensor([[1, 2], [3, 4]])
print(y)
# 输出: tensor([[1, 2],
# [3, 4]])
# 创建随机张量(均值0,方差1)
z = torch.randn(2, 3) # 形状为(2,3)的随机张量
print(z)
2. 张量操作¶
张量支持加减乘除等基本运算,语法和NumPy类似:
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(a + b) # 输出: tensor([5, 7, 9])
print(a * b) # 输出: tensor([4, 10, 18])
# 矩阵乘法
m1 = torch.tensor([[1, 2], [3, 4]])
m2 = torch.tensor([[5, 6], [7, 8]])
print(torch.matmul(m1, m2)) # 或 m1 @ m2
# 输出: tensor([[19, 22],
# [43, 50]])
3. 张量与NumPy互转¶
import numpy as np
# 张量转NumPy
n = z.numpy()
print(type(n)) # 输出: <class 'numpy.ndarray'>
# NumPy转张量
t = torch.from_numpy(n)
print(type(t)) # 输出: <class 'torch.Tensor'>
三、自动求导(Autograd)¶
模型训练需要计算梯度,Pytorch的autograd模块自动完成梯度计算。
例子:计算导数¶
假设函数:y = x² + 3x,求当x=2时的导数dy/dx。
x = torch.tensor(2.0, requires_grad=True) # 标记x需要计算梯度
y = x**2 + 3 * x
# 反向传播求梯度
y.backward() # 计算y对所有requires_grad=True的变量的梯度
print(x.grad) # 输出: tensor(7.) (因为dy/dx=2x+3,x=2时为7)
关键点:requires_grad=True告诉Pytorch需要跟踪x的操作,以便后续计算梯度。
四、模型构建:线性回归(基础模型)¶
模型构建是Pytorch的核心,我们从最简单的线性模型开始:y = wx + b(w:权重,b:偏置)。
1. 定义线性模型¶
使用nn.Module基类定义模型,核心是forward方法(前向传播):
import torch.nn as nn
class LinearRegression(nn.Module):
def __init__(self, input_size, output_size):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(input_size, output_size) # 线性层:y = wx + b
def forward(self, x):
return self.linear(x) # 前向传播
# 初始化模型(输入维度1,输出维度1)
model = LinearRegression(input_size=1, output_size=1)
解释:
- nn.Linear(in_features, out_features):创建线性层,参数为输入特征数和输出特征数。
- forward(x):定义模型的前向计算逻辑。
五、数据准备:模拟数据集¶
我们用一个简单的模拟数据集训练模型:假设真实关系为y = 2x + 3 + 噪声,生成数据并模拟训练集。
1. 生成数据¶
import torch
import numpy as np
# 生成100个样本,x范围在[0, 10],带噪声
np.random.seed(42)
x = np.random.rand(100, 1) * 10 # x: (100,1)
noise = np.random.randn(100, 1) * 1.5 # 噪声
y = 2 * x + 3 + noise # 真实关系:y = 2x + 3 + 噪声
# 转为Pytorch张量
x_tensor = torch.FloatTensor(x)
y_tensor = torch.FloatTensor(y)
2. 数据加载¶
用TensorDataset和DataLoader批量加载数据:
from torch.utils.data import TensorDataset, DataLoader
# 组合数据和标签
dataset = TensorDataset(x_tensor, y_tensor)
dataloader = DataLoader(dataset, batch_size=10, shuffle=True) # 批量大小10,打乱数据
六、模型训练:损失函数与优化器¶
训练模型需要三个核心步骤:计算损失、反向传播、参数更新。
1. 定义损失函数和优化器¶
criterion = nn.MSELoss() # 均方误差损失(MSE)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # SGD优化器,学习率0.01
2. 训练循环¶
epochs = 1000 # 训练轮数
for epoch in range(epochs):
for batch_x, batch_y in dataloader:
# 前向传播:模型预测
pred = model(batch_x)
# 计算损失
loss = criterion(pred, batch_y)
# 反向传播:清零梯度 → 计算梯度 → 更新参数
optimizer.zero_grad() # 清零梯度(避免累积)
loss.backward() # 反向传播计算梯度
optimizer.step() # 更新参数(w和b)
# 每100轮打印损失
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
关键步骤:
- optimizer.zero_grad():必须在每次迭代中清零梯度,否则会累积上一轮的梯度。
- loss.backward():计算损失对所有可学习参数的梯度。
- optimizer.step():根据梯度更新模型参数(w和b)。
七、模型验证与可视化¶
训练后,我们用模型预测并可视化结果:
import matplotlib.pyplot as plt
# 预测结果
predicted = model(x_tensor).detach().numpy() # 移除梯度信息,转为NumPy
# 绘图对比
plt.scatter(x, y, label='真实数据')
plt.plot(x, predicted, 'r-', label='预测结果')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
# 打印学习到的参数
print("学习到的权重w:", model.linear.weight.item()) # 接近2
print("学习到的偏置b:", model.linear.bias.item()) # 接近3
八、总结与扩展¶
通过这个例子,我们掌握了Pytorch的核心流程:
1. 张量操作与自动求导是基础;
2. nn.Module定义模型,forward实现前向传播;
3. DataLoader处理批量数据,提升训练效率;
4. 损失函数(MSE)和优化器(SGD)驱动参数更新。
扩展方向:尝试更复杂的模型(如多层网络)、更换优化器(Adam)或损失函数(交叉熵损失)。Pytorch的灵活性让你可以轻松构建任何深度学习模型!
希望这篇入门教程能帮你快速上手Pytorch,下次我们可以探索更复杂的模型(如CNN、RNN)或真实数据集(如MNIST)。