Pytorch之autograd

autograd:自动求导

PyTorch中所有神经网络的核心是autograd包。让我们先简单地看一下,然后我们来训练我们的第一个神经网络。autograd包为张量上的所有操作提供自动微分。它是一个按运行定义的框架,这意味着反向传播是由代码的运行方式定义的,并且每个迭代都是不同的。
神经网络的依赖于autograd去定义模型以及对这些模型求导。一个nn.Module包含了神经层和一个带有深入返回输出的前向神经方法。

Tensor(张量)

torch.Tensor是包的中心类。如果将其属性.requires_grad设置为True,则它将开始跟踪其上的所有操作。完成计算后,可以调用call.back()并自动计算所有的梯度。这个张量的梯度会被累积到.grad属性里面。
要阻止一个张量跟踪,可以使用
call.detach()*将其从计算分离出来,并防止跟踪未来的计算。
为了防止跟踪历史(和使用内存),您还可以使用torch.no_grad():来包装代码块。这在评估模型时特别有用,因为模型可能有requires_grad=True的可训练参数,但是我们不需要梯度。
Tensor和Function是相互联系的,并且建立了一个无环图,它编码了完整的计算历史。每个张量都有一个.grad_fn属性,它引用了一个已经创建了张量的Function(除了用户创建的张量——他们的grad_fn是空的)。
如果你想计算导数,你可以在一个张量上调用.backward()。如果张量是一个标量(也就是说,它只包含一个元素),你不需要指定任何参数给backward(),但是如果它有更多的元素,你需要指定一个匹配张量形状的梯度参数。

import torch

创建一个张量并设置requires_grad=True来跟踪计算

x = torch.ones(2, 2, requires_grad=True)
print(x)

输出:

tensor([[1., 1.],
        [1., 1.]], requires_grad=True)

做一个张量运算:

y = x + 2
print(y)

输出:

tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)

y是一个操作的结果,所以它有一个grad_fn属性。

print(y.grad_fn)

输出:

<AddBackward0 object at 0x7f90bee98c18>

在y上做更多的操作

z = y * y * 3
out = z.mean()

print(z, out)


Out:
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

.requires_grad_ (…)改变现有张量的requires_grad标志。如果没有给出输入标志,则默认为False。

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)


Out:
False
True
<SumBackward0 object at 0x7f90bee31470>

Gradients(梯度)

现在进行反向传播。因为out包含一个标量,所以out. backwards()等价于out.backward(torch.tensor(1.)).

out.backward()


Print gradients d(out)/dx
print(x.grad)


Out:
tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

在这里插入图片描述
可以使用with torch.no_grad():包裹.requires_grad=True 的方式来停止autograd对tensor的求导:

print(x.requires_grad)
print((x ** 2).requires_grad)

with torch.no_grad():
    print((x ** 2).requires_grad)
Out:

True
True
False
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值