pytorch 前向传播与反向传播代码+ fp16

这篇具有很好参考价值的文章主要介绍了pytorch 前向传播与反向传播代码+ fp16。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

optim.zero_grad() : 将模型的梯度参数设置为0,即清空之前计算的梯度值,在训练模型过程中,每次模型反向传播完成后,梯度都会累加到之前的梯度值上,如果不清空,这些过时的梯度将会影响下一次迭代的结果。因此,使用optim.zero_grad()来清空梯度避免这种情况的发生。保证每次迭代使用的都是当前轮次的新梯度,有效提高模型的训练的精度和稳定性;

predict = model(img):这个过程被称为前向传播过程,在这个过程中,模型参数没有发生更新;

loss = crit(preds, labels): 这个是计算损失函数的过程;

loss.backward(): 这个过程是计算反向传播过程的函数,用户计算模型中所有可训练参数对于当前损失的梯度;backward函数实现了以下几个步骤:

  • 根据之前定义的损失函数loss,先计算出当前模型中所有可以训练的参数对于该损失的梯度值;
  • 通过链式法则将各个参数的梯度值相乘,得到整体模型中所有可训练的参数对于损失函数的梯度;
  • 将梯度值应用于每一个可训练的参数,在调用该函数时,计算图中记录的各个变量的梯度值会被自动计算并累加到每个参数的.grad属性中。这个时候只会将grad参数保存在tensor中,不会去更新具体的每一个参数;在这个过程中,采用的求导方法一般是自动微分机制(Autograd),也就是利用计算图来构建一个计算过程,自动计算每一个节点的梯度,并保存在计算图中,从而方便快捷的计算反向传播过程,

optim.step(): 即对每一个参数,将其当前值减去对应的梯度乘以学习率,更新参数值;

model.zero_grad()optim.zero_grad()的区别和联系: model.zero_grad(),指模型中包含的所有参数的梯度均被清空;optim.zero_grad(),此优化器需要更新的模型参数上的梯度被清空( optim = optim.Optimiers(model.parameters(), lr=args.lr));

在Pytorch中,当调用模型进行推理的时候,就会自动构建计算图。具体来说,每个节点表示一个操作或者一个函数,并将其输入和输出连接起来形成一个有向无环图(ADG)。在计算图中,每个节点都是一个Tensor对象,代表张量数据或梯度值;

predict = model(img)的时候,pytorch会自动对输入数据img进行前向传播计算,构建计算图。假设模型有若干个卷积层、池化层和全连接层,并经过ReLU等激活函数激活,那么计算图将包含这些操作节点以及它们的Tensor输入和输出。图中节点之间的依赖关系表示了数据流的方向和计算过程。

在反向传播过程中,计算图会自动记录中间结果,从而可以计算每个操作节点的梯度值。这样可以非常方便地实现自动求导(auto-differentiation)和梯度下降(gradient descent)优化算法。因此,计算图是PyTorch中实现autograd机制的重要手段。

需要注意的是,如果只是进行预测而不需要计算梯度,可以使用torch.no_grad()上下文管理器来关闭自动求导功能,避免无用的计算和内存消耗。

fp16的运算

from torch.cuda.amp import autocast

model = MyModel()
optimizer = optim.Adam(model.parameters(), lr=0.01)

for epoch in range(num_epochs):
    for inputs, targets in data_loader:
        with autocast(True):
            outputs = model(inputs)
            loss = criterion(outputs, targets)

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

torch.cuda.amp.autocast(True) 是PyTorch框架提供的一种混合精度训练技术,可以在保持数值精度的情况下提高模型的训练速度和内存效率。当启动autocast之后,在支持的硬件中,PyTorch会自动将float32类型的输入数据转化为float16类型,从而在相同内存下能够处理更多的数据;

在使用torch.cuda.amp.autocast(True)上下文管理的时候,这管理器内的所有浮点运算都会使用float16去进行计算,以减小内存占用,从而加快训练速度;里面包括了模型的前向传播过程和损失函数的计算,从而将这些过程中的所有浮点数运算都转换成float16的类型。

  • scaler.scale(): 用于缩放损失值、然后会执行scaler.scale().backward(), 反向传播,得到缩放后梯度值;

  • scaler.step(): 执行反向传播的参数更新

  • scaler.update(): 更新GradScaler对象内部的参数,以便在下一次计算时能够正确地缩放梯度值。
    计算模型参数的梯度值,并将其缩放回float32类型
    使用优化器更新模型参数
    重置GradScaler对象内部的状态,包括缩放后的损失值、缩放比例等文章来源地址https://www.toymoban.com/news/detail-449478.html

到了这里,关于pytorch 前向传播与反向传播代码+ fp16的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 神经网络基础-神经网络补充概念-26-前向和反向传播

    前向传播(Forward Propagation): 前向传播是神经网络中的正向计算过程,用于从输入数据开始,逐层计算每个神经元的输出值,直到得到最终的预测值。在前向传播过程中,我们按以下步骤进行: 输入数据:将输入数据传递给输入层。 加权求和:对每个神经元的输入进行加权

    2024年02月12日
    浏览(39)
  • 【人工智能】神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

    前向传播 是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后,最终得到输出结果的过程。在前向传播中,神经网络会将每一层的输出作为下一层的输入,直到输出层得到最终的结果。 反向传播 是指在神经网络训练过程中,通过计算损失函数的梯度,将

    2024年02月16日
    浏览(45)
  • 【人工智能】— 神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

    前向传播和反向传播 都是神经网络训练中常用的重要算法。 前向传播 是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后,最终得到输出结果的过程。在前向传播中,神经网络会将每一层的输出作为下一层的输入,直到输出层得到最终的结果。 反向传播

    2024年02月10日
    浏览(50)
  • pytorch(三)反向传播

    前馈过程的目的是为了计算损失loss 反向传播的目的是为了更新权重w,这里权重的更新是使用随机梯度下降来更新的。 前馈过程 反馈过程 运行结果 在神经网路中,经常对线性的结果做一个非线性函数的变幻的展开,这就是激活函数。激活函数可以使得模型具有非线性。激活

    2024年01月24日
    浏览(39)
  • [pytorch] 8.损失函数和反向传播

    torch提供了很多损失函数,可查看官方文档Loss Functions部分 作用: 计算实际输出和目标输出之间的差距 为更新输出提供一定的依据(反向传播),grad 损失函数用法差不多,这里以L1Loss和MSEloss为例 L1Loss 注意传入的数据要为float类型,不然会报错,所以inputs和outputs处要加上类

    2024年01月25日
    浏览(37)
  • Pytorch深度学习笔记(五)反向传播算法

    目录 1.为什么要使用反向传播算法 2.二层神经网络 3.反向传播算法更新权值的过程 4.张量Tensor 推荐课程:04.反向传播_哔哩哔哩_bilibili 1.为什么要使用反向传播算法 简单模型可以使用解析式更新w 复杂模型,如图,输入矩阵为5*1矩阵,等一层权重矩阵H1为6*5矩阵,则需要30个解

    2023年04月22日
    浏览(36)
  • PyTorch:梯度计算之反向传播函数backward()

    计算图,是一种用来描述计算的有向无环图。 我们假设一个计算过程,其中 X 1 mathbf{X_1} X 1 ​ 、 W 1 mathbf{W_1} W 1 ​ 、 W 2 mathbf{W_2} W 2 ​ 、 Y mathbf{Y} Y 都是 N N N 维向量。 X 2 = W 1 X 1 mathbf{X_2} = mathbf{W_1}mathbf{X_1} X 2 ​ = W 1 ​ X 1 ​ y = W 2 X 2 mathbf{y} = mathbf{W_2}mathbf{X_2} y

    2023年04月09日
    浏览(40)
  • 模型量化!ONNX转TensorRT(FP32, FP16, INT8)

    本文为Python实现,C++实现链接模型量化 若还没有配置环境(CUDA,CUDNN,TensorRT),请移至C++实现中查看环境配置方法    支持三种不同精度的量化 模型单精度量化 (FP32) 模型半精度量化 (FP16) 模型Int8量化 (INT8) 经测试yolov5,yolov6,yolov7,yolov8转化成功 yolov5: https://github.com/u

    2024年02月16日
    浏览(41)
  • 《动手学深度学习 Pytorch版》 8.7 通过时间反向传播

    本节主要探讨梯度相关问题,因此对模型及其表达式进行了简化,进行如下表示: h t = f ( x t , h t − 1 , w h ) o t = g ( h t , w o ) begin{align} h_t=f(x_t,h_{t-1},w_h)\\\\ o_t=g(h_t,w_o) end{align} h t ​ o t ​ ​ = f ( x t ​ , h t − 1 ​ , w h ​ ) = g ( h t ​ , w o ​ ) ​ ​ 参数字典: t t t 表示时间步

    2024年02月07日
    浏览(43)
  • 【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture04反向传播

    lecture04反向传播 课程网址 Pytorch深度学习实践 部分课件内容: pytorch的机制是动态计算图, tensor里面既有data也有gradient

    2024年02月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包