欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PyTorch_001. 自动微分

程序员文章站 2022-07-13 11:35:30
...

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