前言

PyTorch 是目前学术界最流行的深度学习框架,Facebook 出品,动态图机制让调试变得无比简单。

学完本文,你将掌握:

  • 张量(Tensor)的创建与操作

  • 自动求导(Autograd)原理

  • DataLoader 数据加载

  • 神经网络模块(nn.Module)搭建模型

  • 完整训练循环的4个步骤


1. 张量(Tensor):PyTorch 的基本单位

张量是 PyTorch 的核心数据结构,可以理解为多维数组。0维=标量,1维=向量,2维=矩阵,3维+=高维数组。

Tensor Creation

Tensor Creation

PyTorch 提供了6种最常用的张量创建方式:

import torch

# 六种常见创建方式
a = torch.tensor([1, 2, 3])          # 直接创建一维张量
b = torch.zeros(3, 4)                # 全零张量(3行4列)
c = torch.randn(3, 3)                 # 标准正态分布随机
d = torch.arange(0, 10, 2)           # 等差数列:[0, 2, 4, 6, 8]
e = torch.eye(4)                     # 单位矩阵
f = torch.linspace(0, 1, 5)           # 等分向量

为方便大家学习 这里给大家整理了一份学习资料包 需要的同学 根据下图自取即可

2. 核心张量操作一览

Tensor Operations

Tensor Operations

PyTorch 提供了丰富的张量操作,以下是高频使用的8种:

操作

函数

说明

变形

view / reshape

改变张量形状,不改数据

拼接

cat / stack

在某个维度拼接多个张量

索引

[ ]

切片、选择性读取

数学

+ - * /

逐元素运算

矩阵乘

matmul / dot

矩阵乘法

聚合

sum / mean / max

降维操作

GPU迁移

.to('cuda')

搬到GPU上加速

求导

requires_grad

开启自动求导

x = torch.randn(2, 3)
print(x.shape)        # torch.Size([2, 3])
print(x.view(1, 6))   # 变形为 [1, 6]
print(x.sum(dim=0))   # 按列求和

3. 自动求导(Autograd):PyTorch 的精髓

Autograd 是 PyTorch 最核心的特性——自动计算梯度,无需手动求导!

Autograd

Autograd

import torch

# 创建张量,开启梯度跟踪
x = torch.tensor([1.0], requires_grad=True)

# 构建计算图
y = x ** 2       # y = x²
z = y + 1        # z = y + 1
L = z.mean()     # L = z.mean()

# 一行代码自动求导
L.backward()

# 梯度已自动计算到 .grad 属性
print(x.grad)    # dy/dx = 2x -> x=1 时 = 2

原理:PyTorch 内部构建了计算图(Computational Graph),每一步操作都记录下来,backward() 时自动从后往前反向传播求导。


4. DataLoader:高效加载数据

DataLoader 是 PyTorch 的数据加载器,负责:分批(batch)打乱(shuffle)多进程(num_workers)

DataLoader

DataLoader

from torch.utils.data import TensorDataset, DataLoader
import torch

# 准备数据(用随机数据模拟)
X = torch.randn(1000, 784)   # 1000个样本,784维特征
y = torch.randn(1000, 1)     # 1000个标签

# TensorDataset:将特征和标签打包
dataset = TensorDataset(X, y)

# DataLoader:分批加载
loader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)

# 遍历
for batch_x, batch_y in loader:
    print(batch_x.shape)   # [32, 784]
    break

为方便大家学习 这里给大家整理了一份学习资料包 需要的同学 根据下图自取即可

为什么要用 DataLoader?

  • 自动分批,不用手动切数据

  • shuffle=True 打乱顺序,提升泛化能力

  • num_workers>0 多进程并行加载,速度更快


5. 完整训练流程(4步走)

这是 PyTorch 训练的核心套路,所有模型都是这4步

Training Pipeline

Training Pipeline

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader

# ========== Step 1: 准备数据 ==========
X = torch.randn(1000, 20)
y = (X.sum(dim=1) > 0).float()
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=32, shuffle=True)

# ========== Step 2: 定义模型 ==========
model = nn.Sequential(
    nn.Linear(20, 8),
    nn.ReLU(),
    nn.Linear(8, 1)
)

# ========== Step 3: 损失 & 优化器 ==========
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# ========== Step 4: 训练循环 ==========
for epoch in range(100):
    for batch_x, batch_y in loader:
        optimizer.zero_grad()        # ① 清零梯度
        output = model(batch_x)     # ② 前向传播
        loss = criterion(output.squeeze(), batch_y)  # ③ 计算损失
        loss.backward()             # ④ 反向传播
        optimizer.step()            # ⑤ 更新参数
    if epoch % 20 == 0:
        print(f"Epoch {epoch:3d} | Loss: {loss.item():.4f}")

核心4步口诀zero_grad -> forward -> loss -> backward -> step


6. GPU 加速:让训练快50倍

PyTorch 支持 CUDA GPU 加速,一行代码切换设备:

GPU vs CPU

GPU vs CPU

import torch

# 检测并切换设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")   # cuda 或 cpu

# 模型和数据都迁移到 GPU
model = model.to(device)
batch_x = batch_x.to(device)
batch_y = batch_y.to(device)

# 后续所有计算自动在 GPU 上进行
output = model(batch_x)   # GPU 加速!

性能对比(典型场景):

  • CPU:约 1,000 steps/h

  • GPU:约 50,000 steps/h(提升 50倍)


7. 常用模块速查表

Modules

Modules

模块

用途

示例

nn.Linear

全连接层

nn.Linear(784, 10)

nn.Conv2d

卷积层

nn.Conv2d(3, 64, 3)

nn.LSTM

循环层

nn.LSTM(256, 128)

nn.ReLU

激活函数

nn.ReLU()

nn.Softmax

归一化

nn.Softmax(dim=1)

nn.CrossEntropyLoss

分类损失

nn.CrossEntropyLoss()

nn.MSELoss

回归损失

nn.MSELoss()

optim.Adam

优化器

optim.Adam(model.parameters())

nn.Dropout

正则化

nn.Dropout(0.5)

nn.Embedding

词嵌入

nn.Embedding(10000, 256)


为方便大家学习 这里给大家整理了一份学习资料包 需要的同学 根据下图自取即可

8. 50 行代码入门 PyTorch 完整实战

50 Lines

50 Lines

上面代码已经展示了完整训练流程。这里特别强调保存和加载模型

# 保存整个模型
torch.save(model, "model.pth")

# 加载(推荐:只保存参数)
torch.save(model.state_dict(), "model.pth")      # 保存
model.load_state_dict(torch.load("model.pth"))  # 加载

9. 欠拟合 vs 过拟合

训练模型时,最怕两个问题:欠拟合过拟合

Under Over Fit

Under Over Fit

  • 欠拟合:模型太简单,学不到数据的真实规律 -> 用更复杂的模型

  • 过拟合:模型太复杂,死记硬背噪声数据 -> 用正则化、Dropout、数据增强

# 防止过拟合:添加 Dropout
model = nn.Sequential(
    nn.Linear(20, 64),
    nn.ReLU(),
    nn.Dropout(0.5),     # 训练时随机丢弃50%神经元
    nn.Linear(64, 1)
)

10. 梯度下降可视化

梯度下降是所有优化器的基础——沿梯度的负方向迭代,找到Loss最低的点。

Gradient Descent

Gradient Descent

# 学习率(Learning Rate)非常关键
optimizer = optim.Adam(model.parameters(), lr=0.001)   # lr 太大震荡,太小收敛慢

11. 优化器对比

不同优化器收敛速度差异很大:

Optimizers

Optimizers

优化器

适用场景

特点

SGD

简单任务

收敛慢但稳定

SGD + Momentum

大数据集

加上冲量加速

Adam 通用首选

自适应学习率,效果好

Adagrad

稀疏数据

对稀疏特征效果好

推荐:日常任务直接用 Adam,收敛快效果好。

为方便大家学习 这里给大家整理了一份学习资料包 需要的同学 根据下图自取即可


12. 训练日志解读

学会看 Loss 和 Accuracy 曲线,判断模型状态:

Training Logs

Training Logs

# 训练时打印日志
for epoch in range(100):
    # ... 训练代码 ...
    if epoch % 10 == 0:
        print(f"Epoch {epoch:3d} | Train Loss: {train_loss:.4f} | Val Acc: {val_acc:.2f}%")

正常训练曲线

  • 训练Loss和验证Loss同步下降

  • 如果验证Loss开始上升 -> 过拟合!需要早停或正则化


总结

知识点

核心函数

重要程度

张量创建

torch.tensor/zeros/randn

5星

张量操作

view/cat/matmul/sum

5星

自动求导

requires_grad + backward()

5星

DataLoader

DataLoader + TensorDataset

5星

神经网络

nn.Sequential / nn.Module

5星

GPU加速

.to("cuda")

4星

优化器

optim.Adam / SGD

4星

保存加载

torch.save / load_state_dict

4星

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐