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 参数来指定张量的形状。

猜你喜欢

转载自blog.csdn.net/weixin_41857483/article/details/112980091