装 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.Module 和 optim。