pytorch使用-自动微分


一、自动微分

在整个Pytorch框架中,所有的神经网络本质上都是一个autograd package(自动求导工具包),autograd package提供了一个对Tensors上所有的操作进行自动微分的功能.

以前的pytorch使用Variable来作为自动求导的类型。但是较新版本将tensor和variable合并了,Tensor的数据结构如下:
在这里插入图片描述
Tensor 主要包含三个属性:
.
data:保存Tensor数据。
grad:保存data对应的梯度,grad也是个Tensor,它和data的形状一样。
grad_fn:指向一个Function对象,这个Function用来反向传播计算输入的梯度,

二、Tensor自动微分

当 requires_grad 设置为True,为Tensor 增加梯度:

x = torch.ones(2, 2)
print(x)

y = torch.ones(2, 2, requires_grad=True)
print(y)

在这里插入图片描述
当进行运算时,grad_fn会记录当前操作:

x = torch.ones(2, 2, requires_grad=True)
print(x)

y = x + 2
print(y)

在这里插入图片描述

.requires_grad_ () 原地增加梯度

y = torch.full([2, 2], 3, dtype=torch.float32)

# y 增加梯度
y.requires_grad_(True)
print(y)

z = y * y * 3
out = z.mean()
print(z)
print(out)

在这里插入图片描述

三、backward 反向传播

a = torch.randn(2, 3, requires_grad=True)  # 创建一个张量
b = 3 * a
print(b)

# 给 loss.backward() 指定传递给后向的参数维度:torch.ones_like(b)
b.backward(torch.ones_like(b))  # 自动计算所有梯度
print(a.grad)

在这里插入图片描述

with torch.no_grad(): 关闭梯度更新

with torch.no_grad():
    a = torch.randn(2, 3, requires_grad=True)  # 创建一个张量
    b = 3 * a
    print(b.requires_grad)

    # 给 loss.backward() 指定传递给后向的参数维度:torch.ones_like(b)
    b.backward(torch.ones_like(b))  # 自动计算所有梯度
    # print(a.grad)

在这里插入图片描述
.detach() 删除单个tensor的梯度

a = torch.randn(2, 3, requires_grad=True)  # 创建一个张量
b = 3 * a
print(b)

c = b.detach()
print(c)

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大虾飞哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值