pytorch学习笔记-基础-自动求导

本文介绍了PyTorch的Autograd模块,用于自动计算梯度。从Tensor的requires_grad属性到张量的操作历史记录,详细阐述了如何通过Tensor进行自动求导。包括简单和复杂的自动求导示例,以及Autograd的解析过程,展示了如何扩展Autograd以自定义新的功能。
摘要由CSDN通过智能技术生成
import torch
torch.__version__
'1.2.0'

使用PyTorch计算梯度数值

PyTorch的Autograd模块实现了深度学习的算法中的向传播求导数,在张量(Tensor类)上的所有操作,Autograd都能为他们自动提供微分,简化了手动计算导数的复杂过程。

在0.4以前的版本中,Pytorch使用Variable类来自动计算所有的梯度Variable类主要包含三个属性: data:保存Variable所包含的Tensor;grad:保存data对应的梯度,grad也是个Variable,而不是Tensor,它和data的形状一样;grad_fn:指向一个Function对象,这个Function用来反向传播计算输入的梯度。

从0.4起, Variable 正式合并入Tensor类, 通过Variable嵌套实现的自动微分功能已经整合进入了Tensor类中。虽然为了代码的兼容性还是可以使用Variable(tensor)这种方式进行嵌套, 但是这个操作其实什么都没做。

所以,以后的代码建议直接使用Tensor类进行操作,因为官方文档中已经将Variable设置成过期模块。

要想通过Tensor类本身就支持了使用autograd功能,只需要设置.requries_grad=True

Variable类中的的grad和grad_fn属性已经整合进入了Tensor类中

Autograd

在张量创建时,通过设置 requires_grad 标识为Ture来告诉Pytorch需要对该张量进行自动求导,PyTorch会记录该张量的每一步操作历史并自动计算:

x = torch.rand(5,5,requires_grad=True)
print(x)
x1 = torch.rand(3,3)
print(x1)
tensor([[0.9364, 0.0537, 0.7235, 0.3303, 0.3425],
        [0.2831, 0.3354, 0.8053, 0.6404, 0.5413],
        [0.2591, 0.7848, 0.9179, 0.9172, 0.5571],
        [0.1366, 0.7292, 0.6347, 0.8255, 0.8877],
        [0.6670, 0.5958, 0.9977, 0.2143, 0.1089]], requires_grad=True)
tensor([[0.7993, 0.9223, 0.8159],
        [0.3406, 0.6253, 0.4326],
        [0.4798, 0.3302, 0.2226]])
y = torch.rand(5,5,requires_grad=True)
print(y)
tensor([[0.2061, 0.1664, 0.8448, 0.0021, 0.4401],
        [0.5291, 0.6100, 0.9454, 0.1641, 0.0075],
        [0.2963, 0.1614, 0.1602, 0.6156, 0.1647],
        [0.2429, 0.0149, 0.9505, 0.9009, 0.6450],
        [0.5071, 0.2979, 0.4853, 0.0293, 0.6083]], requires_grad=True)

pytorch 会自动记录和追踪对张量的所有操作,当计算完成后调用.backward()自动计算梯度并将计算结果保存在grad属性中。

print(x+y)
z = torch.sum(x+y)
print(z)
tensor([[1.1425, 0.2201, 1.5683, 0.3324, 0.7826],
        [0.8122, 0.9453, 1.7507, 0.8045, 0.5488],
        [0.5554, 0.9463, 1.0781, 1.5328, 0.7218],
        [0.3795, 0.7440, 1.5852, 1.7264, 1.5327],
        [1.1741, 0.8937, 1.4830, 0.2436, 0.7172]], grad_fn=<AddBackward0>)
tensor(24.2212, grad_fn=<SumBackward0>)

在张量进行操作后,grad_fn已经被赋予了一个新的函数,这个函数引用了一个创建了这个Tensor类的Function对象。 Tensor和Function互相连接生成了一个非循环图,它记录并且编码了完整的计算历史。每个张量都有一个.grad_fn属性,如果这个张量是用户手动创建的那么这个张量的grad_fn是None。

下面我们来调用反向传播函数,计算其梯度

简单的自动求导:

z.backward()
print(x.grad)
print(y.grad)
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.]])
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.]])

如果Tensor类表示的是一个标量(即它包含一个元素的张量),则不需要为backward()指定任何参数,但是如果它有更多的元素,则需要指定一个gradient参数,它是形状匹配的张量。 以上的 z.backward()相当于是z.backward(torch.tensor(1.))的简写。 这种参数常出现在图像分类中的单标签分类,输出一个标量代表图像的标签。

复杂一点的自动求导:

x = torch.rand(5,5,requires_grad=True)
y = torch.rand(5,5,requires_grad=True)
print
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>