pytorch快速入门中文——02

这篇具有很好参考价值的文章主要介绍了pytorch快速入门中文——02。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

torch.autograd的简要介绍

原文:https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autograd-tutorial-py

torch.autograd是 PyTorch 的自动差分引擎,可为神经网络训练提供支持。 在本节中,您将获得有关 Autograd 如何帮助神经网络训练的概念性理解。

背景

神经网络(NN)是在某些输入数据上执行的嵌套函数的集合。 这些函数由参数(由权重和偏差组成)定义,这些参数在 PyTorch 中存储在张量中。

训练 NN 分为两个步骤:

正向传播:在正向传播中,NN 对正确的输出进行最佳猜测。 它通过其每个函数运行输入数据以进行猜测。

反向传播:在反向传播中,NN 根据其猜测中的误差调整其参数。 它通过从输出向后遍历,收集有关函数参数(梯度)的误差导数并使用梯度下降来优化参数来实现。 有关反向传播的更详细的演练,请查看 3Blue1Brown 的视频。

在 PyTorch 中的用法

让我们来看一个训练步骤。 对于此示例,我们从torchvision加载了经过预训练的 resnet18 模型。 我们创建一个随机数据张量来表示具有 3 个通道的单个图像,高度&宽度为 64,其对应的label初始化为一些随机值。

import torch, torchvision
model = torchvision.models.resnet18(pretrained=True)
data = torch.rand(1, 3, 64, 64)
labels = torch.rand(1, 1000)

接下来,我们通过模型的每一层运行输入数据以进行预测。 这是正向传播

prediction = model(data) # forward pass

我们使用模型的预测和相应的标签来计算误差(loss)。 下一步是通过网络反向传播此误差。 当我们在误差张量上调用.backward()时,开始反向传播。 然后,Autograd 会为每个模型参数计算梯度并将其存储在参数的.grad属性中。

loss = (prediction - labels).sum()
loss.backward() # backward pass

接下来,我们加载一个优化器,在本例中为 SGD,学习率为 0.01,动量为 0.9。 我们在优化器中注册模型的所有参数。

optim = torch.optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)

最后,我们调用.step()启动梯度下降。 优化器通过.grad中存储的梯度来调整每个参数。

optim.step() #gradient descent

至此,您已经具备了训练神经网络所需的一切。 以下各节详细介绍了 Autograd 的工作原理-随时跳过它们。


Autograd 的微分

让我们来看看autograd如何收集梯度。 我们用requires_grad=True创建两个张量ab。 这向autograd发出信号,应跟踪对它们的所有操作。

import torch

a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)

我们从ab创建另一个张量Q

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GgWylzfh-1687942607932)(img/tex4-1.gif)]

Q = 3*a**3 - b**2

假设ab是神经网络的参数,Q是误差。 在 NN 训练中,我们想要相对于参数的误差,即

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OzzOnjr-1687942607936)(img/tex4-2.gif)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OR5lzkDK-1687942607938)(img/tex4-3.gif)]

当我们在Q上调用.backward()时,Autograd 将计算这些梯度并将其存储在各个张量的.grad属性中。

我们需要在Q.backward()中显式传递gradient参数,因为它是向量。 gradient是与Q形状相同的张量,它表示Q相对于本身的梯度,即

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DltrYCjJ-1687942607939)(img/tex4-4.gif)]

同样,我们也可以将Q聚合为一个标量,然后隐式地向后调用,例如Q.sum().backward()

external_grad = torch.tensor([1., 1.])
Q.backward(gradient=external_grad)

梯度现在沉积在a.gradb.grad

# check if collected gradients are correct
print(9*a**2 == a.grad)
print(-2*b == b.grad)

出:

tensor([True, True])
tensor([True, True])

可选阅读-使用autograd的向量微积分

从数学上讲,如果您具有向量值函数y = f(x),则y相对于x的雅可比矩阵J

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uS4yMhra-1687942607940)(img/tex4-5.gif)]

一般来说,torch.autograd是用于计算向量雅可比积的引擎。 也就是说,给定任何向量v,计算乘积J^T · v

如果v恰好是标量函数的梯度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9wgQj4bl-1687942607941)(img/tex4-6.gif)]

然后根据链式规则,向量-雅可比积将是l相对于x的梯度:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Djyihyp5-1687942607943)(img/tex4-7.gif)]

上面的示例中使用的是 vector-Jacobian 乘积的这一特征。 external_grad表示v

计算图

从概念上讲,Autograd 在由函数对象组成的有向无环图(DAG)中记录数据(张量)和所有已执行的操作(以及由此产生的新张量)。 在此 DAG 中,叶子是输入张量,根是输出张量。 通过从根到叶跟踪此图,可以使用链式规则自动计算梯度。

在正向传播中,Autograd 同时执行两项操作:

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

当在 DAG 根目录上调用.backward()时,反向传递开始。 autograd然后:

  • 从每个.grad_fn计算梯度,
  • 将它们累积在各自的张量的.grad属性中,然后
  • 使用链式规则,一直传播到叶子张量。

下面是我们示例中 DAG 的直观表示。 在图中,箭头指向前进的方向。 节点代表正向传播中每个操作的反向函数。 蓝色的叶节点代表我们的叶张量ab

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BcRPMLHa-1687942607944)(img/1270bde38f2cfccd4900a5df8ac70a7d.png)]

注意

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

从 DAG 中排除

torch.autograd跟踪所有将其requires_grad标志设置为True的张量的操作。 对于不需要梯度的张量,将此属性设置为False会将其从梯度计算 DAG 中排除。

即使只有一个输入张量具有requires_grad=True,操作的输出张量也将需要梯度。

x = torch.rand(5, 5)
y = torch.rand(5, 5)
z = torch.rand((5, 5), requires_grad=True)

a = x + y
print(f"Does `a` require gradients? : {a.requires_grad}")
b = x + z
print(f"Does `b` require gradients?: {b.requires_grad}")

出:

Does `a` require gradients? : False
Does `b` require gradients?: True

在 NN 中,不计算梯度的参数通常称为冻结参数。 如果事先知道您不需要这些参数的梯度,则“冻结”模型的一部分很有用(通过减少自动梯度计算,这会带来一些性能优势)。

从 DAG 中排除很重要的另一个常见用例是调整预训练网络

在微调中,我们冻结了大部分模型,通常仅修改分类器层以对新标签进行预测。 让我们来看一个小例子来说明这一点。 和以前一样,我们加载一个预训练的 resnet18 模型,并冻结所有参数。

from torch import nn, optim

model = torchvision.models.resnet18(pretrained=True)

# Freeze all the parameters in the network
for param in model.parameters():
    param.requires_grad = False

假设我们要在具有 10 个标签的新数据集中微调模型。 在 resnet 中,分类器是最后一个线性层model.fc。 我们可以简单地将其替换为充当我们的分类器的新线性层(默认情况下未冻结)。

model.fc = nn.Linear(512, 10)

现在,除了model.fc的参数外,模型中的所有参数都将冻结。 计算梯度的唯一参数是model.fc的权重和偏差。

# Optimize only the classifier
optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

请注意,尽管我们在优化器中注册了所有参数,但唯一可计算梯度的参数(因此会在梯度下降中进行更新)是分类器的权重和偏差。

torch.no_grad()中的上下文管理器可以使用相同的排除功能。


进一步阅读:

  • 原地操作&多线程 Autograd
  • 反向模式自动微分 的示例实现

脚本的总运行时间:(0 分钟 5.184 秒)

下载 Python 源码:autograd_tutorial.py

下载 Jupyter 笔记本:autograd_tutorial.ipynb文章来源地址https://www.toymoban.com/news/detail-513152.html

到了这里,关于pytorch快速入门中文——02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • torch.autograd.Function的使用

    (个人理解仅供参考) 自己定义的网络结构,没有现成的,就得手写forward和backward 前向传播的表达式 求导结果 前向传播表达式:y = w * x + b 假设f()是我们关于y的loss函数,那么z = f(y)即为loss值 现在要求loss对w、x、b的偏导(假设只有一层): dz/dx = dz/dy * dy/dx = dz/dy * w dz/dw

    2023年04月11日
    浏览(34)
  • 深度学习之pytorch 中 torch.nn介绍

    pytorch 中必用的包就是 torch.nn,torch.nn 中按照功能分,主要如下有几类: 1. Layers(层):包括全连接层、卷积层、池化层等。 2. Activation Functions(激活函数):包括ReLU、Sigmoid、Tanh等。 3. Loss Functions(损失函数):包括交叉熵损失、均方误差等。 4. Optimizers(优化器):包括

    2024年02月22日
    浏览(45)
  • Pytorch autograd.grad与autograd.backward详解

    平时在写 Pytorch 训练脚本时,都是下面这种无脑按步骤走: 对用户屏蔽底层自动微分的细节,使得用户能够根据简单的几个 API 将模型训练起来。这对于初学者当然是极好的,也是 Pytorch 这几年一跃成为最流行的深度学习框架的主要原因:易用性。 但是,我们有时需要深究自

    2023年04月09日
    浏览(45)
  • pytorch工具——pytorch中的autograd

    注意

    2024年02月15日
    浏览(33)
  • 无脑入门pytorch系列(二)—— torch.mean

    本系列教程适用于没有任何pytorch的同学(简单的python语法还是要的),从代码的表层出发挖掘代码的深层含义,理解具体的意思和内涵。pytorch的很多函数看着非常简单,但是其中包含了很多内容,不了解其中的意思就只能【看懂代码】,无法【理解代码】。 顾名思义,tor

    2024年02月14日
    浏览(39)
  • pytorch2 AutoGrad

    注意:grad在反向传播过程中是累加的(accumulated),这意味着每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需把梯度清零 torch.Tensor 是这个包的核心类。如果设置它的属性 .requires_grad 为 True,那么它将会追踪对于该张量的所有操作。当完成计算后可以

    2024年02月11日
    浏览(41)
  • 快速入门Torch读取自定义图像数据集

    所有数据集都是torch.utils.data.Dataset的子类,即实现了__getitem__和__len__方法。因此,它们都可以传递给torch.utils.data. dataloader,它可以使用torch并行加载多个样本。多处理工人。例如: 还好官方上面文字说需要继承Dataset这个抽象类,实现__getitem__和__len__方法就ok了。 我知道ImageN

    2024年01月20日
    浏览(38)
  • Pytorch Tutorial【Chapter 2. Autograd】

    1. Review Matrix Calculus 1.1 Definition向量对向量求导 ​ Define the derivative of a function mapping f : R n → R m f:mathbb{R}^ntomathbb{R}^m f : R n → R m as the n × m ntimes m n × m matrix of partial derivatives. That is, if x ∈ R n , f ( x ) ∈ R m xinmathbb{R}^n,f(x)inmathbb{R}^m x ∈ R n , f ( x ) ∈ R m , the derivative of f

    2024年02月14日
    浏览(38)
  • 深度解析 PyTorch Autograd:从原理到实践

    本文深入探讨了 PyTorch 中 Autograd 的核心原理和功能。从基本概念、Tensor 与 Autograd 的交互,到计算图的构建和管理,再到反向传播和梯度计算的细节,最后涵盖了 Autograd 的高级特性。 关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理

    2024年02月03日
    浏览(59)
  • Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)

     一、卷积层—Convolution Layers  1.1 1d / 2d / 3d卷积 1.2 卷积—nn.Conv2d() nn.Conv2d 1.3 转置卷积—nn.ConvTranspose nn.ConvTranspose2d  二、池化层—Pooling Layer (1)nn.MaxPool2d (2)nn.AvgPool2d (3)nn.MaxUnpool2d  三、线性层—Linear Layer  nn.Linear  四、激活函数层—Activate Layer (1)nn.Sigmoid  (

    2024年01月20日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包