Autograd

  • AutoGrad简介
  • 前言
  • 注意要点:
  • ==1.只有浮点数才能进行梯度传播==
  • ==2.pytorch不允许tenosr 对 tensor 求导==
  • ==3==. pytroch中会对叶子节点和require_grad=True的节点存储.grad
  • require_grad
  • requires_grad的具体用处(模型中)
  • model.parameters()返回的是==生成器==generator
  • param具体啥样?
  • 还有个named_parameters()方法
  • state_dict()得到的是==OrderedDict顺序字典==
  • 有哪些方法?
  • 如何自定义函数,以及前向后向传播?
  • 1 exp函数
  • 2 linear function
  • 3 ReLu
  • 重要一点是,图是在每次 迭代 时重新创建,这正是允许使用任意Python控制流语句的原因.
  • AutoGrad尽量不要使用inplace的操作
  • 引用


AutoGrad简介

pytorch 警告不输出_子节点

前言

没人能理解超过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.只有浮点数才能进行梯度传播

pytorch 警告不输出_子节点_02


修改一下后

pytorch 警告不输出_深度学习_03

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

动态图长得啥样子?

pytorch 警告不输出_pytorch 警告不输出_04


重点解释

pytorch 警告不输出_python_05

2.pytorch不允许tenosr 对 tensor 求导

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

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

假设计算图如下

pytorch 警告不输出_子节点_06


反向传播

pytorch 警告不输出_子节点_07


绿色是叶子节点

is_leaf is True and requires_grad == True 条件下
才会存储.grad
也可以自己定制:

pytorch 警告不输出_子节点_08


pytorch 警告不输出_深度学习_09

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

pytorch 警告不输出_python_10

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

pytorch 警告不输出_子节点_11

param具体啥样?

pytorch 警告不输出_控制流_12


pytorch 警告不输出_pytorch 警告不输出_13

还有个named_parameters()方法

list(model.named_parameters())

pytorch 警告不输出_子节点_14


另外例子:

>>> 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()

pytorch 警告不输出_深度学习_15

有哪些方法?

dir(param)

pytorch 警告不输出_深度学习_16

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

1 exp函数

pytorch 警告不输出_控制流_17

2 linear function

pytorch 警告不输出_控制流_18

3 ReLu

pytorch 警告不输出_深度学习_19

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

AutoGrad尽量不要使用inplace的操作

pytorch 警告不输出_pytorch 警告不输出_20

pytorch 警告不输出_控制流_21