PyTorch的 autograd

60 篇文章 3 订阅
26 篇文章 0 订阅

AutoGrad简介

在这里插入图片描述

前言

没人能理解超过3维的张量空间

To deal with hyper-planes in a 14-dimensional space, visualize a 3-D space and say ‘fourteen’ to yourself very loudly. Everyone does it —Geoffrey Hinton

注意要点:

1.只有浮点数才能进行梯度传播

在这里插入图片描述
修改一下后
在这里插入图片描述

从概念上讲,autograd记录一个,记录在您执行操作时创建数据的所有操作,从而为您提供一个有向无环图,其输入张量输出张量。通过从根到叶跟踪这个图,您可以使用链式法则自动计算梯度。

动态图长得啥样子?

在这里插入图片描述
重点解释
在这里插入图片描述

2.pytorch不允许tenosr 对 tensor 求导

求导时都是 标量 对 Tensor进行求导。因此如果根节点是向量,就需要配个权重,然后求和变成标量,然后再反向传播梯度。

3. pytroch中会对叶子节点和require_grad=True的节点存储.grad

假设计算图如下
在这里插入图片描述
反向传播
在这里插入图片描述
绿色是叶子节点
is_leaf is True and requires_grad == True 条件下
才会存储.grad

也可以自己定制:
在这里插入图片描述
在这里插入图片描述

require_grad

每个张量都有一个flag:requires_grad,允许从梯度计算中具体的排除某些子图,并可以提高效率。

输入变量中,只要有存在requires_grad = True的情况,那么输出变量的requires_grad 标志就为 True

>>> x = torch.randn(5, 5)  # requires_grad=False by default 默认为 false
>>> y = torch.randn(5, 5)  # requires_grad=False by default 默认为 false
>>> z = torch.randn((5, 5), requires_grad=True)
>>> a = x + y
>>> a.requires_grad
False
>>> b = a + z
>>> b.requires_grad
True

在这里插入图片描述

requires_grad的具体用处(模型中)

model.parameters()返回的是生成器generator

>>> model.parameters()
<generator object Module.parameters at 0x000001FC903EA728>
import torch
import torchvision
model = torchvision.models.resnet18(pretrained=True)

for param in model.parameters():
    param.requires_grad = False
# Replace the last fully-connected layer替换最后一层全连接层
# Parameters of newly constructed modules have requires_grad=True by default 整个新的模型仍然是requires_grad = True

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

# Optimize only the classifier 优化器更新分类器参数
optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

注意param是一种class
在这里插入图片描述

param具体啥样?

在这里插入图片描述
在这里插入图片描述

还有个named_parameters()方法

list(model.named_parameters())
在这里插入图片描述
另外例子:

>>> bn = torch.nn.BatchNorm1d(3, track_running_stats=True)
>>> list(bn.named_parameters())
[('weight', Parameter containing: tensor([1., 1., 1.], requires_grad=True)),
 ('bias', Parameter containing: tensor([0., 0., 0.], requires_grad=True))]

>>> list(bn.named_buffers())
[('running_mean', tensor([0., 0., 0.])),
 ('running_var', tensor([1., 1., 1.])),
 ('num_batches_tracked', tensor(0))]

>>> bn.state_dict()
OrderedDict([('weight', tensor([1., 1., 1.])),
             ('bias', tensor([0., 0., 0.])),
             ('running_mean', tensor([0., 0., 0.])),
             ('running_var', tensor([1., 1., 1.])),
             ('num_batches_tracked', tensor(0))])

state_dict()得到的是OrderedDict顺序字典

model.state_dict()
在这里插入图片描述

有哪些方法?

dir(param)
在这里插入图片描述

如何自定义函数,以及前向后向传播?

1 exp函数

在这里插入图片描述

2 linear function

在这里插入图片描述

3 ReLu

在这里插入图片描述

重要一点是,图是在每次 迭代 时重新创建,这正是允许使用任意Python控制流语句的原因.

AutoGrad尽量不要使用inplace的操作

在这里插入图片描述

在这里插入图片描述

引用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物琴弦光锥之外

给个0.1,恭喜老板发财

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值