PyTorch_001. 自动微分
0. 写在前面
autograd 包是 PyTorch 中所有神经网络的核心。这个 软件包为 Tensors 上的所有操作提供自动微分。这是一个由运行定义的框架,即以代码运行方式定义其后向传播,且每次迭代都可以不同。下面通过一些例子来进行说明。
1. 自动微分
1.1 requires_grad 和 grad_fn
- 导入库
import torch
- 创建一个 3X3 的全 1 的张量
X = torch.ones(3, 3, requires_grad=True)
print(X)
requires_grad=True
说明:tensor 的 requires_grad 参数,在 pytorch 的计算图中,tensor可以分成两种:叶子节点和非叶子节点。在反向传播的过程中,计算梯度时并不是对所有的 tensor,需要计算梯度的 tensor 是:是叶子节点且 requires_grad = True,且 依赖这个 tensor 的所有的 tensor 的 requires_grad 也为 True。
输出结果:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], requires_grad=True)
requires_grad
的默认值是 False,若某个 tensor 最初的此属性是 False,在后续的操作中,想对其此属性进行更改,可以通过 requires_grad_()
进行更改,如下:
S = torch.ones(3, 3)
T = S + 2
print("before: ", T.requires_grad)
T.requires_grad_(True)
print("after: ", T.requires_grad)
输出结果:
before: False
after: True
- 对 X 张量执行一个加法操作
Y = X + 4
print(Y)
print(Y.grad_fn)
输出结果:
tensor([[5., 5., 5.],
[5., 5., 5.],
[5., 5., 5.]], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x00000279DBE3F088>
grad_fn
是 tensor 的一个属性,记录了 tensor 的运算信息,记录的这个运算信息有利于反向传播算法的使用。
- 对 Y 执行操作
Z = 2 * Y * Y
result = Z.mean()
print(Z)
print(result)
输出结果:
tensor([[50., 50., 50.],
[50., 50., 50.],
[50., 50., 50.]], grad_fn=<MulBackward0>)
tensor(50., grad_fn=<MeanBackward0>)
因为 grad_fn
记录的是运算的信息,所以自己创建的新的 tensor 是没有 grad_fn 的;
X = torch.ones(3, 3, requires_grad=True)
print(X.grad_fn)
输出结果:
None
1.2 梯度
如果想计算导数,可以调用 Tensor.backward()
。若 Tensor 是标量(即只包含一个元素数据),那么不需要指定任何参数backward();但如果有更多的元素,那么需要指定一个 gradient 参数来指定张量的形状。
上一篇: PyTorch中的自动微分
下一篇: 有关HashMap