PyTorch中连续调用id(tensor[x][y])为何得到不同结果?
为啥PyTorch张量索引的id会不一样?
先看你给出的代码示例:
x=torch.rand(3,3) id(x[0][0]) 1186163119824 id(x[0][0]) 1186163118464 id(x[0,0]) 1186163118464 id(x[0,0]) 1186163118464
这不是id()函数的bug,完全是PyTorch张量的索引机制和Python列表差异导致的:
对于
x[0][0]这种链式索引:
第一次调用时,x[0]会返回一个共享原张量数据的新视图对象,接着对这个视图取[0],又生成一个新的0维张量对象。每次执行x[0][0],都会重复这个“生成临时视图→生成临时元素对象”的过程,两次生成的对象是完全独立的,所以它们的内存地址(也就是id()返回的值)不一样。而且这些临时对象用完就会被Python回收,内存地址可以被后续新对象复用。对于
x[0,0]这种逗号分隔的索引:
这是PyTorch原生的高级索引语法,它会直接从原张量中定位到目标元素,不会生成中间的临时视图。PyTorch内部对这种索引做了优化,每次调用返回的是同一个0维张量对象,所以两次id()返回的结果一致。
总结下:Python列表的索引是直接返回元素的内存引用,而PyTorch的链式索引每次都会产生临时张量对象,而逗号索引是一次性定位,返回的对象更稳定。
内容的提问来源于stack exchange,提问作者chen zhang
相关产品推荐
相关产品推荐

