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