安装Anaconda

image-20240909000959700


安装Pytorch

使用Anaconda新建Pytorch环境,激活新环境以后安装Pytorch

image-20240909001137964

这里不要使用conda安装,否则后续的torch.cuda.is_avilable()**的返回值都是FALSE**,会出现下面的问题。需要在安装好的conda中使用pip安装,CUDA版本可以向下兼容。

image-20240909002224831


PyTorch与NumPy函数区别

大部分的PyTorch与NumPy函数是相同的,矩阵全部变为张量,部分函数的名字不同,但功能基本一致。

np 变为 torch、array 变为 tensor

image-20240924140829047


PLT使用

下面的网站有很多PLT的案例,可以替换成自己的数据以后直接使用 Examples — Matplotlib 3.9.2 documentation

使用PLT有两种方式,一种是MATLAB方式,一种是面相对象的方式。MATLAB的方式更全面,也更符合MATLAB使用的习惯。

image-20240924142949129

各层大小计算

卷积层:

image-20240925183018383

池化层:

image-20240925182956352

案例:

image-20240925183058663
以下是对”PyTorch学习分享”博客的详细续写,延续原有风格并深入技术细节:


自动求导机制(Autograd)

PyTorch的核心特性是动态计算图,通过requires_grad属性实现自动微分:

1
2
3
4
5
6
import torch

x = torch.tensor([2.0], requires_grad=True)
y = x**2 + 3*x + 1
y.backward() # 自动计算梯度
print(x.grad) # 输出: tensor([7.]) (因为 dy/dx = 2x + 3)

计算图原理

动态计算图

  1. 叶子节点:用户创建的张量(如x
  2. 运算节点:执行数学操作时创建
  3. 梯度计算backward()从根节点反向传播梯度

调试提示:使用detach()断开计算图,with torch.no_grad():禁用梯度跟踪


损失函数与优化器

常用损失函数对比

函数名称 公式 适用场景
nn.MSELoss() ∥y_pred - y_true∥² 回归任务
nn.CrossEntropyLoss() -Σ y_true·log(softmax) 多分类任务
nn.BCELoss() -[y·logŷ + (1-y)log(1-ŷ)] 二分类任务

优化器选择指南

1
2
3
4
5
6
7
8
9
10
11
from torch import optim

# 常用优化器初始化
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 或
optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))

# 训练循环中的关键步骤:
optimizer.zero_grad() # 清零梯度 ← 必须步骤!
loss.backward() # 反向传播
optimizer.step() # 更新参数

重要提醒:忘记zero_grad()会导致梯度累积,引发训练异常


模型训练完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1. 数据准备
train_loader = DataLoader(dataset, batch_size=64, shuffle=True)

# 2. 模型定义
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(32*13*13, 10) # 尺寸计算见前文公式

def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = torch.flatten(x, 1)
return self.fc1(x)

# 3. 训练循环
for epoch in range(10):
for inputs, labels in train_loader:
outputs = model(inputs)
loss = criterion(outputs, labels)

optimizer.zero_grad()
loss.backward()
optimizer.step()

# 验证集评估
with torch.no_grad():
val_acc = compute_accuracy(val_loader)
print(f"Epoch {epoch+1}: Val Acc={val_acc:.2%}")

模型保存与加载

正确保存方式

1
2
3
4
5
6
7
8
9
10
# 保存完整模型(含结构)
torch.save(model, 'model_full.pth')

# 只保存参数(推荐)
torch.save(model.state_dict(), 'model_weights.pth')

# 加载方法
model = CNN() # 需先实例化空模型
model.load_state_dict(torch.load('model_weights.pth'))
model.eval() # 切换为评估模式!

多GPU训练保存技巧

1
2
3
# 使用DataParallel时
model = nn.DataParallel(model)
torch.save(model.module.state_dict(), 'multi_gpu_model.pth') # 注意.module

GPU加速实践

设备切换最佳实践

1
2
3
4
5
6
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 将模型和数据移至设备
model.to(device)
inputs = inputs.to(device)
labels = labels.to(device)

性能优化技巧

  1. 数据加载:使用pin_memory=True + non_blocking=True
    1
    2
    3
    loader = DataLoader(dataset, pin_memory=True, num_workers=4)
    # 训练循环中:
    inputs = inputs.to(device, non_blocking=True)
  2. 混合精度训练
    1
    2
    3
    4
    5
    6
    7
    8
    9
    scaler = torch.cuda.amp.GradScaler()

    with torch.cuda.amp.autocast():
    outputs = model(inputs)
    loss = criterion(outputs, labels)

    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

学习建议

  1. 官方资源
  2. 调试工具
    • 使用torch.autograd.detect_anomaly()定位NaN值
    • 通过torchsummary打印模型结构:
      1
      2
      from torchsummary import summary
      summary(model, input_size=(1, 28, 28)) # MNIST输入尺寸
  3. 可视化
    • TensorBoard集成:from torch.utils.tensorboard import SummaryWriter
    • 网络结构可视化:torchviz.make_dot(y, params=dict(model.named_parameters()))

持续关注torch.compile()等新特性,可提升训练速度30%以上!