Pytorch神经网络之自动微分
基于官方教程,记载小鱼的个人理解,记录些许项目,以及不断遇到的离奇的bug及杀虫方法。
autograd
autograd是pytorch之中的一个核心计算,提供了自动计算微分、跟踪微分过程、反向传播的方法,可以让我们在建立好神经网络之后,直接调用反向传播等autograd中包含的方法,高效训练神经网络。本文中只简单介绍一些常用的autograd方法,在后续的机器学习实战中,小鱼将展现给你autograd的用法。
requires_grad && grad_fn
设置tensor的requires_grad属性为True,代表记录tensor进行的运算操作。对于编程员自己声明的tensor,默认requires_grad=False,而对于计算得到的tensor,默认requires_grad=True
import torch
x=torch.ones(9,5,requires_grad=True)
y=x+2
print(x)
print(y)
tensor([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]], requires_grad=True)
tensor([[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.]], grad_fn=<AddBackward0>)
grad_fn则记录了tensor的计算方法。
tensor.backward && tesnor.grad
为了计算某个out对于值x的微分,需要先将out进行反向传播,再运算x.grad即out对于x的微分值。
z=3*y*y
out=z.mean()
print(z)
print(out)
out.backward(retain_graph=True)
print(x.grad)
v=torch.ones(9,5)
z.backward(v)
print(x.grad)
tensor([[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.],
[27., 27., 27., 27., 27.]], grad_fn=<MulBackward0>)
tensor(27., grad_fn=<MeanBackward0>)
tensor([[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000],
[0.4000, 0.4000, 0.4000, 0.4000, 0.4000]])
tensor([[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000],
[18.4000, 18.4000, 18.4000, 18.4000, 18.4000]])
由于out是一个值,x则是矩阵,所以out对x的微分用矩阵表示,矩阵中每个值,即out对该位置的值的微分。而且由于out是一个值,所以out.backward不需要填写参数,默认参数为torch.tensor(1.)。文中还设置了retain_graph=True,是为了下文再进行backward操作,否则后续backward操作会报错。而反向传播矩阵z时,我们则需要设置一个同规模的简单矩阵,以之为参数进行反向传播。
关于原理可以参考官方文档中的这部分内容。从x到out的计算过程相同,区别在于官方文档的x规模为:
总结&&参考文献
神经网络中常用的即tensor.backward()方法和tensor.grad()方法,熟练使用可以高效编写神经网络代码。
PyTorch官方教程中文版:http://pytorch123.com/
本文地址:https://blog.csdn.net/StarfishCu/article/details/107061873
上一篇: python环境搭建详细步骤