python - pytorch克隆张量后如何计算grad
问题描述
我的简单代码:
import torch
x = torch.randn(4, requires_grad=True).cuda()
y = torch.randn(4, requires_grad=True).cuda()
z = torch.zeros(4)
z = torch.clone(x)
z.retain_grad()
h = (z + y) * z
l = torch.randn(4).cuda()
loss = (l - h).pow(2).sum()
loss.backward()
print('x.grad=', x.grad)
print('z.grad=', z.grad)
输出:
x.grad= None
z.grad= tensor([-15.3401, -3.2623, -2.1670, 0.1410], device='cuda:0')
为什么 x.grad 是 None 但与 z.grad 不同?如果我希望它们相同,我该怎么办?
解决方案
x.retain_grad()
如果要保留张量 x 的梯度,则需要在声明 x 后调用。
推荐阅读
- javascript - 材料角表未排序
- python-3.x - 在 python 中的热图中创建热图
- .net - 为什么 VB.NET 编辑并继续对选项严格关闭不起作用?
- coq - 编写类似 c 的类以在 Coq 中运行
- javascript - 我应该使用 Javascript Bookmarklets 还是其他东西来执行基本的表单填写任务?
- javascript - next-router 和 redux 没有获取之前的状态
- vue.js - 样式不适用于 HTML 元素
- units-of-measurement - AttributeError:模块“metpy.units”没有属性“结”
- python - 将文件从 GCP 存储推送到另一个没有 sdk 的存储桶
- c++ - 在 C/C++ 中的循环声明外或内初始化计数循环变量