装 PyTorch

pip install torch

Tensor:和 NumPy 几乎一样

import torch

a = torch.tensor([1, 2, 3])
b = torch.zeros(2, 3)
c = torch.ones(2, 3)
d = torch.randn(2, 3)         # 标准正态

print(a.shape)                 # torch.Size([3])
print(a.dtype)                 # torch.int64

# 像 NumPy 一样切片 / 运算
b + c                          # 对应元素相加
b @ c.T                        # 矩阵乘法
b.mean()
b.reshape(3, 2)

NumPy 与 Tensor 互转

import numpy as np

a = np.array([1, 2, 3])
t = torch.from_numpy(a)        # numpy → tensor

t = torch.tensor([1, 2, 3])
a = t.numpy()                  # tensor → numpy

GPU 加速

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

x = torch.randn(1000, 1000, device=device)
y = x @ x                       # GPU 上算,比 CPU 快几十倍

苹果 Mac M 系列:

device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")

autograd:自动求导

PyTorch 最重要的特性。让一个 tensor requires_grad=True,PyTorch 就会记录它的运算图,事后能算梯度:

x = torch.tensor(3.0, requires_grad=True)
y = x ** 2 + 2 * x + 1          # y = (x+1)²

y.backward()                    # 反向传播
print(x.grad)                   # dy/dx = 2x + 2 = 8

y.backward() 触发自动求导,沿运算图反向计算每个变量的梯度,存到 .grad 属性。

多变量

w = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
x = torch.tensor([0.5, 0.5, 0.5])

y = (w * x).sum() + 5
y.backward()

print(w.grad)            # tensor([0.5, 0.5, 0.5])

"训练"的本质

# 玩具版本:手动训练 y = 3x + 2
import torch

# 数据
xs = torch.tensor([1.0, 2.0, 3.0, 4.0])
ys = torch.tensor([5.0, 8.0, 11.0, 14.0])

# 参数(需要学习的)
w = torch.tensor(0.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)

lr = 0.01
for step in range(200):
    preds = w * xs + b
    loss = ((preds - ys) ** 2).mean()    # MSE 损失
    loss.backward()                       # 自动算梯度
    with torch.no_grad():                 # 更新参数时不要记录运算
        w -= lr * w.grad
        b -= lr * b.grad
        w.grad.zero_()                    # 别忘了清零
        b.grad.zero_()

print(f"w={w.item():.3f}, b={b.item():.3f}")    # ≈ 3, 2

这段代码体现了所有深度学习训练的本质:前向算损失 → backward 算梯度 → 更新参数 → 重复。

后面会简化掉的细节

  • with torch.no_grad(): 防止记录梯度图
  • .grad.zero_() 必须手动清零,否则梯度会累加
  • 学习率 lr 怎么选

下一篇用 PyTorch 的内置工具简化这一切——nn.Moduleoptim