初识 torch.Autograd:理解pytorch网络训练过程

举报
墨理学AI 发表于 2022/02/23 19:12:58 2022/02/23
【摘要】 学习笔记

本博文是运行 pytorch quickstart_tutorial 记录的粗糙笔记


Disabling Gradient Tracking 禁止 梯度 跟踪


默认情况下,所有具有 requires_grad=True 的张量都在跟踪它们的计算历史并支持梯度计算。

但是,在某些情况下我们不需要这样做,例如,当我们训练了模型并且只想将其应用于某些输入数据时,即我们只想通过网络进行前向计算。

我们可以通过用 torch.no_grad() 块包围我们的计算代码来停止跟踪计算:

摘自 pytorch 教程

import torch

z = torch.matmul(x, w)+b
print(z.requires_grad)

with torch.no_grad():
    z = torch.matmul(x, w)+b
print(z.requires_grad)

There are reasons you might want to disable gradient tracking【关闭梯度跟踪的原因】:

  • 将神经网络中的某些参数标记为冻结参数,这是微调预训练网络的一个非常常见的场景
  • 在仅进行前向传递时加快计算速度,不对张量进行梯度跟踪,计算会更加高效

0-1


理解 y = w * X + b


0-2


Optional Reading: Tensor Gradients and Jacobian Products【梯度和雅克比积】


摘自该文档

In many cases, we have a scalar loss function, and we need to compute the gradient with respect to some parameters. However, there are cases when the output function is an arbitrary tensor. In this case, PyTorch allows you to compute so-called Jacobian product, and not the actual gradient.

在很多情况下,我们有一个标量损失函数,我们需要计算一些参数的梯度。 但是,有些情况下输出函数是任意张量。 在这种情况下,PyTorch 允许您计算所谓的雅可比积,而不是实际的梯度。


什么是超参数


超参数是可调节的参数,用来控制模型优化过程, 不同的超参数值会影响模型训练和收敛速度;

2-1


Optimization Loop 【迭代优化】


2-2


Loss Function 【损失函数】


当提供一些训练数据时,我们未经训练的网络可能不会给出正确的答案。 损失函数衡量得到的结果与目标值的不相似程度,是我们在训练过程中想要最小化的损失函数。 为了计算损失,我们使用给定数据样本的输入进行预测,并将其与真实数据标签值进行比较。

2-3


Optimizer 【 优化器】


优化是在每个训练步骤中调整模型参数以减少模型误差的过程。 优化算法定义了这个过程是如何执行的(在这个例子中我们使用随机梯度下降)。 所有优化逻辑都封装在优化器对象中。 在这里,我们使用 SGD 优化器; 此外,PyTorch 中有许多不同的优化器可用,例如 ADAM 和 RMSProp,它们更适用于不同类型的模型和数据。

在训练循环中,优化分三步进行:

  1. 调用 optimizer.zero_grad() 来重置模型参数的梯度。 默认情况下渐变相加;为了防止重复计算,我们在每次迭代时明确地将它们归零。
  2. 通过调用 loss.backwards() 来反向传播预测损失。 PyTorch 将损失的梯度存入 w.r.t. 每个参数。
  3. 一旦我们有了梯度,我们就调用 optimizer.step() 来通过向后传递中收集的梯度来调整参数。

2-4


Saving and Loading Model Weights 【保存 加载 模型】


3-1


Saving and Loading Models with Shapes【模型网络结构 和 参数 存储于一个 xx.pth 文件】


3-2


Exporting Model to ONNX


PyTorch 还具有本机 ONNX 导出支持。 然而,鉴于 PyTorch 执行图的动态特性,导出过程必须遍历执行图以生成持久化的 ONNX 模型。 出于这个原因,应该将适当大小的测试变量传递给导出例程(在我们的例子中,我们将创建一个正确大小的虚拟零张量):

input_image = torch.zeros((1,3,224,224))
onnx.export(model, input_image, 'model.onnx')
  • 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️
  • 1-0

    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
    • 点赞
    • 收藏
    • 关注作者

    评论(0

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。