一、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. 数据加载

TensorDatasetDataLoader批量加载数据:

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)。

小夜