【PyTorch知识点汇总】

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()
相关推荐
星核0penstarry15 分钟前
ToolGrad:把数据生成倒过来,工具调用样本通过率提到 99.8%
人工智能·测试工具·llm·函数调用·数据合成·文本调用
南京兴帝文化传媒有限公司18 分钟前
基于地图平台的本地商户信息优化:药店夜间服务标注与客户转化实操
前端·javascript·数据库·人工智能·geo 优化·geo优化避坑·ai搜索获客
2601_9620782322 分钟前
Python接口自动化流程(pytest)
python·pytest·接口自动化·测试框架·断言
tachibana224 分钟前
WebSocket 和 SSE 通信的区别及局限性
网络·人工智能·websocket·网络协议·ai·llm·agent
weixin_4462608526 分钟前
AI 驱动的 CTF 自动解题系统部署
人工智能
Thneonl29 分钟前
拆开一道 FDE 面试题,我看到三场十年前的考试
人工智能·架构
袁天30 分钟前
我从 0 基础一个月用 AI 编程做了 4 个项目,最后把踩过的坑做成了agent项目纪律系统
人工智能
葫三生31 分钟前
三生原理与《涌现:从简单规则到复杂世界》在“简单规则生成复杂系统”核心思路上存在理论呼应?
人工智能·科技·算法·机器学习·开源
南京兴帝文化传媒有限公司37 分钟前
地图SEO与AI搜索优化结合实践:宁国摄影工作室本地获客案例分析
大数据·前端·人工智能·geo 优化·geo优化避坑
sarasuki43 分钟前
上下文快爆炸了?Agent 的两种压缩手段:微压缩 vs LLM 摘要
人工智能·ai编程