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

Pytorch神经网络之自动微分

程序员文章站 2024-01-20 22:18:28
小鱼的Pytorch撞墙到撞墙墙到撞墙墙墙的精通之路二:自动微分autogradrequires_grad && grad_fntensor.backward && tesnor.grad总结&&参考文献基于官方教程,记载小鱼的个人理解,记录些许项目,以及不断遇到的离奇的bug及杀虫方法。autogradautograd是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则是9×59\times5矩阵,所以out对x的微分用矩阵表示,矩阵中每个值,即out对该位置的值的微分。而且由于out是一个值,所以out.backward不需要填写参数,默认参数为torch.tensor(1.)。文中还设置了retain_graph=True,是为了下文再进行backward操作,否则后续backward操作会报错。而反向传播矩阵z时,我们则需要设置一个同规模的简单矩阵,以之为参数进行反向传播。
关于原理可以参考官方文档中的这部分内容。从x到out的计算过程相同,区别在于官方文档的x规模为2×22\times2
Pytorch神经网络之自动微分

总结&&参考文献

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

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