我面临着pythorch不一致的行为,根据weither的说法,索引是一个列表或整数。请看以下代码片段:
# First example, integer selector ==> Ok
t = torch.tensor([[0, 1], [1, 0]])
t[0, 0].add_(10)
print(t)
tensor([[10, 1],
[ 1, 0]])
# Second example, list selector ==> ???
t = torch.tensor([[0, 1], [1, 0]])
t[[0], [0]].add_(10) # notice the list selector
print(t)
tensor([[0, 1],
[1, 0]])
#Third example, list selector with inplace add operator ==> Ok
t = torch.tensor([[0, 1], [1, 0]])
t[[0], [0]] += 10
print(t)
tensor([[10, 1],
[ 1, 0]])
我不明白为什么在第二个例子中pytorch
无法更新t
!你知道吗
请参见两种索引之间的区别:
当您直接索引
t
的(0, 0)
元素时,您有一个对该条目的引用,您可以将add_
放入该条目。t[0,0]
的形状是[]
——也就是说,你得到了一个标量,即(0,0)
项的内容。但是,当使用列表索引
([0], [0])
时,得到的是一维张量,形状是[1]
。也就是说,得到t
的次张量的拷贝。然后你把add_
放在亚张量的副本上,你对原始的t
没有影响:也许你想研究^{} 来完成你的任务。你知道吗
更新 当您使用列表索引分配给
t
时,您并不是在创建副本(这毫无意义)。所以转换为
也就是说,在右边,我们有一个
(0,0)
的t
子张量的拷贝,我们在这个子张量上加10,得到一个[1]
的形状张量,值为[10]
。在左边,我们把这个[10]
赋给t
的(0,0)
子张量(不是赋给它的一个副本-这毫无意义)。因此
t[[0], [0]] += 10
的输出是这是因为花哨的索引(即使用列表索引)返回一个副本,而直接索引返回一个原始张量的视图。检查这种情况的一个简单方法是比较底层的storage
注意
a[0]
是一个元素,但是它的存储仍然是完整的数组,因为它只是原始张量的一个视图。你知道吗相关问题 更多 >
编程相关推荐