gpt4 book ai didi

python - PyTorch 和 Numpy 中的张量条目选择逻辑发散

转载 作者:行者123 更新时间:2023-12-04 10:45:01 25 4
gpt4 key购买 nike

描述

我正在设置一个 torch.Tensor用于掩蔽目的。当尝试按索引选择条目时,结果是使用 numpy.ndarray 之间的行为和 torch.Tensor持有索引数据是不同的。我想访问解释差异的框架和相关文档中的设计。

复制步骤

环境

官方发布的容器中的 Pytorch 1.3:pytorch/pytorch:1.3-cuda10.1-cudnn7-devel
例子

说我需要设置 masktorch.Tensor具有形状的对象 [3,3,3]并在条目 (0,0,1) 处设置值& (1,2,0)1 .下面的代码解释了差异。

mask = torch.zeros([3,3,3])
indices = torch.tensor([[0, 1],
[0, 2],
[1, 0]])

mask[indices.numpy()] = 1 # Works
# mask[indices] = 1 # Incorrect result

我注意到在使用 mask[indices.numpy()] 时全新 torch.Tensor形状 [2] , 而 mask[indices]返回一个新的 torch.Tensor形状 [3, 2, 3, 3] ,这表明张量切片逻辑的差异。

最佳答案

你会得到不同的结果,因为这就是 Pytorch 中索引的实现方式。如果您将数组作为索引传递,则它会被“解包”。例如:

indices = torch.tensor([[0, 1], [0, 2], [1, 0]])

mask = torch.arange(1,28).reshape(3,3,3)

# tensor([[[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9]],

# [[10, 11, 12],
# [13, 14, 15],
# [16, 17, 18]],

# [[19, 20, 21],
# [22, 23, 24],
# [25, 26, 27]]])
mask[indices.numpy()]相当于 mask[[0, 1], [0, 2], [1, 0]] ,即 indices.numpy() 第 i 行的元素用于选择 mask 的元素沿第 i 个轴。所以它返回 tensor([mask[0,0,1], mask[1,2,0]]) ,即 tensor([2, 16]) .

另一方面,当将张量作为索引传递时(我不知道这种区分数组和索引张量的确切原因),它不像数组那样“解包”,并且第 i 行的元素的 indices张量用于选择 mask 的元素沿轴 0。即, mask[indices]相当于 mask[[[0, 1], [0, 2], [1, 0]], :, :]
>>> mask[ind]

tensor([[[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]],

[[10, 11, 12],
[13, 14, 15],
[16, 17, 18]]],


[[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]],

[[19, 20, 21],
[22, 23, 24],
[25, 26, 27]]],


[[[10, 11, 12],
[13, 14, 15],
[16, 17, 18]],

[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]]]])

这基本上是 tensor(mask[[0,1], :, :], mask[[0,2],: ,:], mask[[1,0], :, :])并有形状 indices.shape + mask[0,:,:].shape == (3,2,3,3) .所以整个“工作表”被选中并堆叠成新的尺寸。注意这不是一个新的张量,而是 mask的一个特殊 View 。 .因此,如果您分配 mask[indices] = 1 ,特别是 indices ,然后是 mask 的所有元素会变成1。

关于python - PyTorch 和 Numpy 中的张量条目选择逻辑发散,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59744467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com