计算图:
用来描述运算的有向无环图有两个主要元素,结点note 边edge结点表示数据,如向量,矩阵,张量边表示运算,如加减乘除使用计算图主要是为了求导方便, 只需要沿着计算图的方向找到需要求导对象的所有路径, 对路径上的所有导数求和即该求导对象的梯度。
叶子结点:
用户创建的结点,区分叶子结点的目的是节省内存,代码运行之后会释放点非叶子结点的数据;
非叶子结点梯度为none是因为在反向传播之后非叶子结点的梯度被释放掉以节省内存;
若想保存非叶子节点的梯度,以a为例,执行 a.retain_grad(),可保存目标梯度。
grad_fn:记录创建该张量时所用的方法
pytorch ----------- 动态图 ------- 是根据每一步的计算过程来搭建计算图
tensorFlow -------静态图 ------- 先搭建好所有的计算图再运行
用计算图表示 y = (w + x) * (w + 8)
import torch
# 结点
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
# 边
a = torch.add(w, x)
a.retain_grad()
b = torch.add(w, 8)
y = torch.mul(a, b)
y.backward()
print(w.grad)
# 查看叶子结点--叶子结点即用户创建的结点,
# 区分叶子结点的目的是节省内存,
# 在代码运行之后会释放点非叶子结点的数据
print("is_leaf:\n", w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf)
# 查看梯度
# 非叶子结点梯度为none是因为在反向传播之后非叶子结点的梯度被释放掉以节省内存
# 若想保存非叶子节点的梯度,以a为例,执行 a.retain_grad(),可保存目标梯度
print("gradient:\n", w.grad, x.grad, a.grad, b.grad, y.grad)
# 查看 grad_fn
# grad_fn ----- 记录创建该张量时所用的方法
# 如 AddBackward0 MulBackward0
print("grad_fn:\n", w.grad_fn, x.grad_fn, a.grad_fn, b.grad_fn, y.grad_fn)