如何在不中断反向传播的情况下为pytorch变量分配新值?

时间:2018-12-17 16:34:41

标签: pytorch

我有一个pytorch变量,用作模型的可训练输入。在某些时候,我需要手动重新分配此变量中的所有值。

如何做到这一点而又不中断使用损失功能的连接?

假设当前值为[1.2, 3.2, 43.2],而我只是希望它们成为[1,2,3]

1 个答案:

答案 0 :(得分:1)

您可以使用张量的data属性来修改值,因为对data的修改不会影响图形。
因此该图仍将保持完整,并且data属性本身的修改对该图没有影响。 (data上的操作和更改不会被自动分级跟踪,因此不会显示在图中)

由于您没有给出示例,因此该示例基于您的注释语句:
'假设我想更改图层的权重。'
我在这里使用了普通张量,但这对于图层的weight.databias.data属性是相同的。

这是一个简短的示例:

import torch
import torch.nn.functional as F



# Test 1, random vector with CE
w1 = torch.rand(1, 3, requires_grad=True)
loss = F.cross_entropy(w1, torch.tensor([1]))
loss.backward()
print('w1.data', w1)
print('w1.grad', w1.grad)
print()

# Test 2, replacing values of w2 with w1, before CE
# to make sure that everything is exactly like in Test 1 after replacing the values
w2 = torch.zeros(1, 3, requires_grad=True)
w2.data = w1.data
loss = F.cross_entropy(w2, torch.tensor([1]))
loss.backward()
print('w2.data', w2)
print('w2.grad', w2.grad)
print()

# Test 3, replace data after computation
w3 = torch.rand(1, 3, requires_grad=True)
loss = F.cross_entropy(w3, torch.tensor([1]))
# setting values
# the graph of the previous computation is still intact as you can in the below print-outs
w3.data = w1.data
loss.backward()

# data were replaced with values from w1
print('w3.data', w3)
# gradient still shows results from computation with w3
print('w3.grad', w3.grad)

输出:

w1.data tensor([[ 0.9367,  0.6669,  0.3106]])
w1.grad tensor([[ 0.4351, -0.6678,  0.2326]])

w2.data tensor([[ 0.9367,  0.6669,  0.3106]])
w2.grad tensor([[ 0.4351, -0.6678,  0.2326]])

w3.data tensor([[ 0.9367,  0.6669,  0.3106]])
w3.grad tensor([[ 0.3179, -0.7114,  0.3935]])

这里最有趣的部分是w3。在调用backward时,这些值将替换为w1的值。
但是,梯度是根据具有原始w3值的CE函数计算出来的。替换的值对图形没有影响。 因此,图连接没有断开,替换对图没有影响。希望这就是您想要的!