当前位置: 移动技术网 > IT编程>脚本编程>Python > 小鱼的Pytorch撞墙到撞墙墙到撞墙墙墙的精通之路二:自动微分

小鱼的Pytorch撞墙到撞墙墙到撞墙墙墙的精通之路二:自动微分

2020年07月03日  | 移动技术网IT编程  | 我要评论


基于官方教程,记载小鱼的个人理解,记录些许项目,以及不断遇到的离奇的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则是9×59\times5矩阵,所以out对x的微分用矩阵表示,矩阵中每个值,即out对该位置的值的微分。而且由于out是一个值,所以out.backward不需要填写参数,默认参数为torch.tensor(1.)。文中还设置了retain_graph=True,是为了下文再进行backward操作,否则后续backward操作会报错。而反向传播矩阵z时,我们则需要设置一个同规模的简单矩阵,以之为参数进行反向传播。
关于原理可以参考官方文档中的这部分内容。从x到out的计算过程相同,区别在于官方文档的x规模为2×22\times2
在这里插入图片描述

总结&&参考文献

神经网络中常用的即tensor.backward()方法和tensor.grad()方法,熟练使用可以高效编写神经网络代码。
PyTorch官方教程中文版:http://pytorch123.com/

本文地址:https://blog.csdn.net/StarfishCu/article/details/107061873

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网