在创建新变量时是否转移梯度?

2024-10-03 09:11:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

A = Tensor of [186,3]

如果我创建一个新的空张量,如下所示:

tempTens = torch.tensor(np.zeros((186,3)), requires_grad = True).cuda()

我在a的一个块上做了一些运算,然后把它输出到Tentens中,我完全用它来做进一步的计算,比如说:

tempTens[20,:] = SomeMatrix * A[20,:] 

梯度真的会被正确地传递吗?假设我有一个成本函数,它优化了诱惑的输出,使之符合一些基本事实


Tags: of代码truenpzerostorchcuda梯度
1条回答
网友
1楼 · 发布于 2024-10-03 09:11:29

在这种情况下,tempTens[20,:] = SomeMatrix * A[20,:]是关于tempTens的就地操作,通常不能保证使用autograd。但是,如果通过应用concatenation这样的操作来创建新变量

output = torch.cat([SomeMatrix * A[20, :], torch.zeros(163, 3, device='cuda')], dim=0)

在数学方面,您将得到相同的结果(一个矩阵包含SomeMatrix * A[20, :]的前20行和后面166行0),但这将在autograd中正常工作。一般来说,这是处理这类问题的正确方法。你知道吗

相关问题 更多 >