pytorch基础4-自动微分

2024-03-03 18:12
文章标签 基础 自动 pytorch 微分

本文主要是介绍pytorch基础4-自动微分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

专题链接:https://blog.csdn.net/qq_33345365/category_12591348.html

本教程翻译自微软教程:https://learn.microsoft.com/en-us/training/paths/pytorch-fundamentals/

初次编辑:2024/3/2;最后编辑:2024/3/3


本教程第一篇:介绍pytorch基础和张量操作

本教程第二篇:介绍了数据集与归一化

本教程第三篇:介绍构建模型层的基本操作。

本教程第四篇:介绍自动微分相关知识,即本博客内容。

另外本人还有pytorch CV相关的教程,见专题:

https://blog.csdn.net/qq_33345365/category_12578430.html


自动微分


使用torch.autograd自动微分 Automaic differentiation

在训练神经网络时,最常用的算法是反向传播(back propagation)。在这个算法中,参数(模型权重)根据损失函数相对于给定参数的梯度进行调整。损失函数(loss function)计算神经网络产生的预期输出和实际输出之间的差异。目标是使损失函数的结果尽可能接近零。该算法通过神经网络向后遍历以调整权重和偏差来重新训练模型。这就是为什么它被称为反向传播。随着时间的推移,通过反复进行这种回传和前向过程来将损失(loss)减少到0的过程称为梯度下降。

为了计算这些梯度,PyTorch具有一个内置的微分引擎,称为torch.autograd。它支持对任何计算图进行梯度的自动计算。

考虑最简单的单层神经网络,具有输入x,参数wb,以及某些损失函数。可以在PyTorch中如下定义:

import torchx = torch.ones(5)  # input tensor
y = torch.zeros(3)  # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b  # z = x*w +b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)

张量、函数与计算图(computational graphs)

在这个网络中,wb参数,他们会被损失函数优化。因此,需要能够计算损失函数相对于这些变量的梯度。为此,我们将这些张量的requires_grad属性设置为True。

**注意:**您可以在创建张量时设置requires_grad的值,也可以稍后使用x.requires_grad_(True)方法来设置。

我们将应用于张量的函数(function)用于构建计算图,这些函数是Function类的对象。这个对象知道如何在前向方向上计算函数,还知道在反向传播步骤中如何计算其导数。反向传播函数的引用存储在张量的grad_fn属性中。

print('Gradient function for z =',z.grad_fn)
print('Gradient function for loss =', loss.grad_fn)

输出是:

Gradient function for z = <AddBackward0 object at 0x00000280CC630CA0>
Gradient function for loss = <BinaryCrossEntropyWithLogitsBackward object at 0x00000280CC630310>

计算梯度

为了优化神经网络中参数的权重,需要计算损失函数相对于参数的导数,即我们需要在某些固定的xy值下计算 ∂ l o s s ∂ w \frac{\partial loss}{\partial w} wloss ∂ l o s s ∂ b \frac{\partial loss}{\partial b} bloss。为了计算这些导数,我们调用loss.backward(),然后从w.gradb.grad中获取值。

loss.backward()
print(w.grad)
print(b.grad)

输出是:

tensor([[0.2739, 0.0490, 0.3279],[0.2739, 0.0490, 0.3279],[0.2739, 0.0490, 0.3279],[0.2739, 0.0490, 0.3279],[0.2739, 0.0490, 0.3279]])
tensor([0.2739, 0.0490, 0.3279])

注意: 只能获取计算图中设置了requires_grad属性为True的叶节点的grad属性。对于计算图中的所有其他节点,梯度将不可用。此外,出于性能原因,我们只能对给定图执行一次backward调用以进行梯度计算。如果我们需要在同一图上进行多次backward调用,我们需要在backward调用中传递retain_graph=True

禁用梯度追踪 Disabling gradient tracking

默认情况下,所有requires_grad=True的张量都在跟踪其计算历史并支持梯度计算。然而,在某些情况下,我们并不需要这样做,例如,当我们已经训练好模型并且只想将其应用于一些输入数据时,也就是说,我们只想通过网络进行前向计算。我们可以通过将我们的计算代码放在一个torch.no_grad()块中来停止跟踪计算:

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

输出是:

True
False

另外一种产生相同结果的方法是在张量上使用detach方法:

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

有一些理由你可能想要禁用梯度跟踪:

  • 将神经网络中的某些参数标记为冻结参数(frozen parameters)。这在微调预训练网络的情况下非常常见。
  • 当你只进行前向传播时,为了加速计算,因为不跟踪梯度的张量上的计算更有效率。

计算图的更多知识

概念上,autograd 在一个有向无环图 (DAG) 中保留了数据(张量)和所有执行的操作(以及生成的新张量),这些操作由 Function 对象组成。在这个 DAG 中,叶子节点是输入张量,根节点是输出张量。通过从根节点到叶子节点追踪这个图,你可以使用链式法则(chain rule)自动计算梯度。

在前向传播中,autograd 同时执行两件事情:

  • 运行所请求的操作以计算结果张量,并且
  • 在 DAG 中维护操作的 梯度函数(gradient function)

当在 DAG 根节点上调用 .backward() 时,反向传播开始。autograd 然后:

  • 从每个 .grad_fn 计算梯度,
  • 将它们累积在相应张量的 .grad 属性中,并且
  • 使用链式法则一直传播到叶子张量。

PyTorch 中的 DAG 是动态的

一个重要的事情要注意的是,图是从头开始重新创建的;在每次 .backward() 调用之后,autograd 开始填充一个新的图。这正是允许您在模型中使用控制流语句的原因;如果需要,您可以在每次迭代中更改形状、大小和操作。

代码汇总:

import torchx = torch.ones(5)  # input tensor
y = torch.zeros(3)  # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w) + b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)print('Gradient function for z =', z.grad_fn)
print('Gradient function for loss =', loss.grad_fn)loss.backward()
print(w.grad)
print(b.grad)z = torch.matmul(x, w) + b
print(z.requires_grad)with torch.no_grad():z = torch.matmul(x, w) + b
print(z.requires_grad)z = torch.matmul(x, w) + b
z_det = z.detach()
print(z_det.requires_grad)

这篇关于pytorch基础4-自动微分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/770478

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)

00 - React 基础

1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名如:npx create-react-app react-redux-pro JSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 JavaScript 代码中编写 HTML。 const element =

WordPress网创自动采集并发布插件

网创教程:WordPress插件网创自动采集并发布 阅读更新:随机添加文章的阅读数量,购买数量,喜欢数量。 使用插件注意事项 如果遇到404错误,请先检查并调整网站的伪静态设置,这是最常见的问题。需要定制化服务,请随时联系我。 本次更新内容 我们进行了多项更新和优化,主要包括: 界面设置:用户现在可以更便捷地设置文章分类和发布金额。代码优化:改进了采集和发布代码,提高了插件的稳定

AI赋能天气:微软研究院发布首个大规模大气基础模型Aurora

编者按:气候变化日益加剧,高温、洪水、干旱,频率和强度不断增加的全球极端天气给整个人类社会都带来了难以估计的影响。这给现有的天气预测模型提出了更高的要求——这些模型要更准确地预测极端天气变化,为政府、企业和公众提供更可靠的信息,以便做出及时的准备和响应。为了应对这一挑战,微软研究院开发了首个大规模大气基础模型 Aurora,其超高的预测准确率、效率及计算速度,实现了目前最先进天气预测系统性能的显著

【青龙面板辅助】JD商品自动给好评获取京豆脚本

1.打开链接 开下面的链接进入待评价商品页面 https://club.jd.com/myJdcomments/myJdcomments.action?sort=0 2.登陆后执行脚本 登陆后,按F12键,选择console,复制粘贴以下代码,先运行脚本1,再运行脚本2 脚本1代码 可以自行修改评价内容。 var content = '材质很好,质量也不错,到货也很快物流满分,包装快递满