pytorch—自动求导

autograd简介

PyTorch通过自动求导autograd包对tensor的所有操作提供自动求导机制。在训练神经网络模型反向传播时,通过调用.backward()可以方便计算出loss关于每一个node的梯度。

自动求导就是在你构造前向计算流图(自定义模型)的同时,PyTorch会自动构造一个反向求导的计算流图,反向求导算子是和你使用前向计算的算子对应的,比如conv2d对应的反向计算算子为conv2d_backward。

from __future__ import print_function    #注意是有两个下划线
# 如果某个版本中出现了某个新的功能特性,而且这个特性和当前版本中使用的不兼容,
# 也就是它在该版本中不是语言标准,那么我如果想要使用的话就需要从future模块导入。
import torch
x=torch.randn(3,3,requires_grad=True)
print(x.grad_fn)
None

如果需要计算导数,可以在 Tensor 上调用 .backward()。如果 Tensor 是一个标量(即它包含一个元素的数据),则不需要为 backward() 指定任何参数,但是如果它有更多的元素,则需要指定一个gradient参数,该参数是形状匹配的张量。

x=torch.ones(2,2,requires_grad=True)
x
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
y=x**2
y
tensor([[1., 1.],
        [1., 1.]], grad_fn=)
y.grad_fn

z=y*y*3
out=z.mean()
z,out
(tensor([[3., 3.],
         [3., 3.]], grad_fn=),
 tensor(3., grad_fn=))

梯度

out.backward()
x.grad
tensor([[3., 3.],
        [3., 3.]])

注意:grad在反向传播过程中是累加的(accumulated),这意味着每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需把梯度清零。

out2=x.sum()
out2.backward()
x.grad
tensor([[4., 4.],
        [4., 4.]])
out3=x.sum()
x.grad.data.zero_()
out3.backward()
x.grad
tensor([[1., 1.],
        [1., 1.]])
q=torch.ones(4,5)
q
tensor([[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]])
q.data.norm()
tensor(4.4721)

你可能感兴趣的:(pytorch,深度学习,python)