pytorch中的列选择是否可区分?

pat*_*ick 2 python backpropagation pytorch

Pytorch中的列选择是否可以区分?例如,如果我想从每一行中选择一列以创建一个新的行X 1数组,然后使用此新数组作为背景,背景将正常工作吗?

qvalues = qvalues[range(5),[0,1,0,1,0]]
Run Code Online (Sandbox Code Playgroud)

如上所示从5 * 2张量完成元素选择?

Man*_*nas 7

我认为是这样。让我用代码举例。

首先我们创建qvalues张量,然后说我们要计算其梯度

qvalues = torch.rand((5, 5), requires_grad=True)
Run Code Online (Sandbox Code Playgroud)

现在,我们创建张量以对其进行索引,并获得5x2张量作为其结果(我认为这与您想要对进行的选择相同qvalues[range(5),[0,1,0,1,0]]):

y = torch.LongTensor([1, 3])
new_qvalues = qvalues[:, y]
Run Code Online (Sandbox Code Playgroud)

我们看到new_qvalues原始切片qvalues将计算梯度

print(new_qvalues.requires_grad) # True
Run Code Online (Sandbox Code Playgroud)

现在我们执行数学运算。在此示例代码中,我正在做平方,new_qvalues因为我们知道它的梯度(导数)将为2 * new_qvalues

qvalues_a = new_qvalues ** 2
Run Code Online (Sandbox Code Playgroud)

现在,我们必须计算的梯度qvalues_a。我们设置retain_graph=True为存储.grad每个张量的,并避免在向后传递时释放缓冲区。

qvalues_a.backward(torch.ones(new_qvalues.shape), retain_graph=True)
Run Code Online (Sandbox Code Playgroud)

现在,我们可以回到原始位置qvalues,看看是否已计算出梯度

print(qvalues)
print(qvalues.grad)

# result of the print statemets

#tensor([[ 0.9677,  0.4303,  0.2036,  0.3870,  0.6085],
#    [ 0.8876,  0.8695,  0.2028,  0.3283,  0.1560],
#    [ 0.1764,  0.4718,  0.5418,  0.5167,  0.6200],
#    [ 0.7610,  0.9322,  0.5584,  0.5589,  0.8901],
#    [ 0.8146,  0.7296,  0.8036,  0.5277,  0.5754]])

#tensor([[ 0.0000,  0.8606,  0.0000,  0.7739,  0.0000],
#    [ 0.0000,  1.7390,  0.0000,  0.6567,  0.0000],
#    [ 0.0000,  0.9435,  0.0000,  1.0334,  0.0000],
#    [ 0.0000,  1.8645,  0.0000,  1.1178,  0.0000],
#    [ 0.0000,  1.4592,  0.0000,  1.0554,  0.0000]])
Run Code Online (Sandbox Code Playgroud)

我们可以观察到仅在选定索引中如何计算梯度。为确保这一点,我们通过比较所选切片的值等于导数来创建一些快速测试。qvalues.grad2 * new_qvalues

assert torch.equal(qvalues.grad[:, y], 2 * new_qvalues)
Run Code Online (Sandbox Code Playgroud)

而且它不会引发任何错误,因此我假设您可以获得切片的渐变。