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

PyTorch学习——autograd: 自动微分

程序员文章站 2022-03-06 21:00:22
...
from __future__ import print_function
import torch as t
import numpy as np

# 分割测试样例
print('-'*30)

# 要想使得 Tensor 使用autograd功能,只需要设置tensor.requries_grad=True.

# 为 tensor 设置 requires_grad 标识,代表着需要求导数
# pytorch 会自动调用 autograd 记录操作
x = t.ones(2, 2, requires_grad=True)
# 上一步等价于
# x = t.ones(2, 2)
# x.requires_grad = True
print('x: \n' + str(x))

# y = x.sum() = (x[0][0] + x[0][1] + x[1][0] + x[1][1])
y = x.sum()
print('y: \n' + str(y))

# .grad_fn 表明该变量是怎么来的
# <SumBackward0 object at 0x000001A9AD118438>,表明 y 是 sum() 得来的
print('y.grad_fn: \n' + str(y.grad_fn))

# 分割测试样例
print('-'*30)

y.backward()
# 每个值的梯度都为1
print('y.backward() -x.grad: \n' + str(x.grad))

# 分割测试样例
print('-'*30)

y.backward()
# grad在反向传播过程中是累加的(accumulated),
# 这意味着每一次运行反向传播,梯度都会累加之前的梯度,
# 所以反向传播之前需把梯度清零。
print('y.backward() -x.grad: \n' + str(x.grad))

y.backward()
print('y.backward() -x.grad: \n' + str(x.grad))

# 分割测试样例
print('-'*30)

# 以下划线结束的函数是 inplace 操作,会修改自身的值,就像add_
print('x.grad.data.zero_(): \n' + str(x.grad.data.zero_()))

y.backward()
print('y.backward() -x.grad: \n' + str(x.grad))