pytorch自动求导

科比一路走好,愿曼巴精神永存!

具体用法参照官方文档

1
2
3
4
5
6
import torch
x = torch.ones(2, 2, requires_grad=True)
# .requires_grad 设置为 True,则会开始跟踪针对 tensor 的所有操作
# 调用 .backward() 来自动计算所有梯度
# 调用 .detach(),它将其与计算历史记录分离
print(x)

1
2
3
# 针对张量进行操作
y = x + 2
print(y)

1
2
3
4
5
# Tensor 和 Function 互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息
# 每个张量都有一个 .grad_fn 属性保存着创建了张量的 Function 的引用
# 用户自己创建张量,则g rad_fn 是 None
print(x.grad_fn)
print(y.grad_fn)

1
2
3
4
5
# 对 y 做更多的操作
z = y * y * 3
out = z.mean()

print(z, out)

1
2
3
4
5
6
7
8
# .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)

1
2
3
4
5
6
7
8
# out.backward(y) 后向传播
print(x.requires_grad, y.requires_grad, z.requires_grad)
print(out.requires_grad)
out.backward()
# 由梯度计算的链式法则算到所有的结果变量
# 所计算的梯度都是结果变量关于创建变量的梯度
# graph leaves(事先创建,而非运行得到的中间结果)
print(x.grad)

1
2
3
4
5
6
# 停止对跟踪历史中张量求导
print(x.requires_grad)
print((x ** 2).requires_grad)

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

注意 1. 求导只对用户定义的变量进行,即对各个leaf Variable计算梯度 2. 运算结果变量的“requires_grad”是不可以更改的,且不会改变