【PyTorch知识点汇总】

本文介绍了PyTorch,一个流行的深度学习框架,涵盖了张量操作、数据类型转换、自动微分、神经网络模块、DataLoader数据加载、模型训练、多GPU并行、动态计算图、混合精度训练、量化压缩以及可视化工具的使用示例。
摘要由CSDN通过智能技术生成

PyTorch是一个广泛使用的深度学习框架,它提供了许多功能强大的工具和函数,用于构建和训练神经网络。以下是一些PyTorch的常用知识点和示例说明:

  1. 张量(Tensors)

    • 创建张量:使用torch.tensor()​、torch.Tensor()​或特定创建函数如torch.zeros()​, torch.ones()​, torch.randn()​等创建不同类型的张量。

      import torch
      x = torch.tensor([1., 2., 3.])  # 创建一个浮点型张量
      zeros_tensor = torch.zeros((3, 4))  # 创建一个3x4的全零张量
      
    • 张量操作:类似NumPy,支持各种数学运算和索引操作,如加减乘除、矩阵乘法、广播机制、切片等。

      y = torch.tensor([4., 5., 6.])
      result = x + y  # 张量加法
      
    • 数据类型转换:通过.to()​方法可以改变张量的数据类型或者设备(CPU/GPU)。

      device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
      x_gpu = x.to(device)  # 将张量移动到GPU上
      
  2. 自动微分(Autograd)

    • 使用.requires_grad_()​标记张量以启用梯度计算:

      x.requires_grad_()
      y = x * 2
      z = y.sum()
      z.backward()  # 自动计算梯度
      print(x.grad)  # 输出x的梯度
      
  3. 神经网络模块(nn.Module)

    • 定义网络结构:继承自nn.Module​并实现__init__​和forward​方法。

      import torch.nn as nn
      
      class SimpleNet(nn.Module):
          def __init__(self):
              super(SimpleNet, self).__init__()
              self.linear = nn.Linear(784, 10)  # 定义一个线性层
      
          def forward(self, x):
              out = self.linear(x)
              return out
      
    • 构建与训练模型:

      model = SimpleNet()
      criterion = nn.CrossEntropyLoss()
      optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
      
      for epoch in range(num_epochs):
          # 前向传播
          output = model(inputs)
          loss = criterion(output, targets)
      
          # 反向传播及优化
          optimizer.zero_grad()
          loss.backward()
          optimizer.step()
      
  4. 数据加载器(DataLoader)

    • 使用torch.utils.data.DataLoader​来加载和批处理数据。

      from torch.utils.data import DataLoader, TensorDataset
      
      dataset = TensorDataset(data_tensor, label_tensor)
      dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
      for batch_data, batch_labels in dataloader:
          # 在每个迭代周期中,batch_data和batch_labels会是当前批次的张量数据
          pass
      
  5. 保存与加载模型

    • 使用torch.save()​和torch.load()​保存和加载模型参数或整个模型。

      torch.save(model.state_dict(), 'model.pth')  # 保存模型参数
      model.load_state_dict(torch.load('model.pth'))  # 加载模型参数
      
      # 或者保存整个模型
      torch.save(model, 'model_full.pth')  # 保存整个模型(包括其结构和参数)
      loaded_model = torch.load('model_full.pth', map_location=device)  # 加载整个模型
      
  6. 多GPU并行训练

    • 使用torch.nn.DataParallel​或torch.nn.parallel.DistributedDataParallel​进行多GPU训练。

      model = nn.DataParallel(SimpleNet())  # 如果有多块GPU可用,则将模型分布到多个GPU上
      
  7. 控制流(autograd with control flow)

    • PyTorch支持在动态图模式下使用Python的控制流语句(如if-else、for循环),并且能正确跟踪梯度。

动态计算图、混合精度训练、量化压缩、可视化工具

动态计算图(Dynamic Computation Graph)
在PyTorch中,计算图是在运行时构建的,这意味着你可以根据程序运行的状态实时改变网络结构或执行不同的计算路径。这是与静态计算图框架如TensorFlow的一个显著区别。

示例:

# 动态改变模型结构
class DynamicModel(nn.Module):
    def __init__(self):
        super(DynamicModel, self).__init__()
        self.linear1 = nn.Linear(10, 5)
        self.linear2 = nn.Linear(5, 3)

    def forward(self, x, use_second_layer=True):
        out = F.relu(self.linear1(x))
        if use_second_layer:
            out = self.linear2(out)  # 根据条件决定是否使用第二层
        return out

model = DynamicModel()

混合精度训练(Mixed Precision Training)
混合精度训练利用了FP16和FP32数据类型的优势,通过将部分计算转移到半精度上以减少内存占用和加快计算速度,同时保持关键部分(如梯度更新)在全精度下进行,以维持数值稳定性。

使用torch.cuda.amp​模块实现自动混合精度训练:

import torch
from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()

for inputs, targets in dataloader:
    inputs = inputs.cuda()
    targets = targets.cuda()

    with autocast():
        outputs = model(inputs)
        loss = criterion(outputs, targets)

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

量化压缩(Quantization)
量化是将模型的权重和激活从浮点数转换为低比特整数的过程,从而减小模型大小并加速推理。PyTorch提供了量化API来实现这一过程。

简化版量化示例:

import torch.quantization

# 假设model是一个已经训练好的模型
model_fp32 = ...  # 初始化并训练模型

# 首先对模型进行伪量化(模拟量化)
prepared_model = torch.quantization.prepare(model_fp32)
# 进行量化校准(收集统计数据)
quantized_model = torch.quantization.convert(prepared_model)

# 现在quantized_model是一个量化后的模型,可以用于推理

可视化工具
PyTorch支持通过torchviz​库来进行计算图可视化,或者配合其他工具(如TensorBoard)展示模型结构、训练指标等。

对于简单的计算图可视化:

from torchviz import make_dot

x = torch.randn(5, requires_grad=True)
y = x * 2
z = y ** 2
z.backward(torch.ones_like(z))

dot_graph = make_dot(z)
dot_graph.view()  # 在Jupyter Notebook中显示图形

对于模型结构可视化,通常结合torchsummary​或直接使用TensorBoard配合torch.utils.tensorboard​接口:

from torchsummary import summary

summary(model, input_size=(1, 28, 28))  # 对于卷积神经网络,输入维度为(通道, 高, 宽)

# 或者在TensorBoard中展示模型结构
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter()
writer.add_graph(model, torch.rand((1, 28, 28)))  # 输入一个随机张量获取模型结构
writer.close()

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stsdddd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值