Python PyTorch的OpenNMT问题:。复制函数未清除行为

Python PyTorch的OpenNMT问题:。复制函数未清除行为,python,machine-learning,pytorch,Python,Machine Learning,Pytorch,我正在使用PyTorch版本的OpenNMT,并试图修改波束搜索算法。我目前被困在beam\u update功能(文件中)。调用时: sent\u states.data.copy_( 发送状态。数据。索引。选择(1,位置)) 根据.copy功能的原理,它将 将元素从src复制到self张量并返回self 但是,“自张量”指的是什么?有人能给我解释一下这个函数的作用吗,或者给我指出源代码,因为我找不到它…self张量就是你称之为copy的张量。 在您的示例中,它是sent\u states.d

我正在使用PyTorch版本的OpenNMT,并试图修改波束搜索算法。我目前被困在
beam\u update
功能(文件中)。调用时:

sent\u states.data.copy_(
发送状态。数据。索引。选择(1,位置))

根据
.copy
功能的原理,它将

将元素从src复制到self张量并返回self


但是,“自张量”指的是什么?有人能给我解释一下这个函数的作用吗,或者给我指出源代码,因为我找不到它…

self张量就是你称之为copy的张量。 在您的示例中,它是
sent\u states.data


回答评论中提出的问题:为什么复制的行为不像分配
=

.copy()
创建新内存位置的真实副本,而使用
=
赋值只存储对内存位置的引用

下面的代码显示了执行中的差异:

import torch

torch.manual_seed(3515)
tensor1 = torch.rand(2, 3)
tensor2 = torch.rand(2, 2)
tensor3 = torch.rand(2, 3)
positions = torch.tensor([2, 0])

tensor2.data.copy_(tensor1.data.index_select(1, positions))
tensor3.data = tensor1.data.index_select(1, positions)
print(tensor2)
print(tensor3)
print(id(tensor1.data[0]))
print(id(tensor2.data[0]))
print(id(tensor3.data[0]))
输出:

tensor([[ 0.5939,  0.8861],
        [ 0.7525,  0.1537]])
tensor([[ 0.5939,  0.8861],
        [ 0.7525,  0.1537]])
4583187080
4583187008
4583187080

tensor1
tensor3
的位置是一样的,而tensor2被复制到了一个新的位置

我想是一样的,但是如果我用:
sent\u states.data=sent\u states.data.index\u select(1,positions)
来代替这个调用,网络的行为会有所不同。不同意味着什么?我在一个简单的最小示例上尝试了这一点,它像预期的那样工作。是的,很抱歉,我没有提供任何澄清。我想(如果我错了,请有人纠正我)beam_update函数必须更新beam状态,以确保翻译过程中的一致性。只有上面的修改,网络翻译是不同的(质量较低),我不明白为什么。有什么原因吗,为什么使用
。数据
,而不是包装张量
发送到美国
?所以你不能打电话给
sent\u states=sent\u states.index\u select(1,positions)
?@francescopanini我想我找到了答案并更新了答案