【问题标题】:OpenNMT issue with PyTorch: .copy_ function not clear behaviorPyTorch 的 OpenNMT 问题:.copy_ 功能不清楚行为
【发布时间】:2018-12-11 14:54:17
【问题描述】:

我正在使用 PyTorch 版本的 OpenNMT,并且正在尝试修改 Beam Search 算法。我目前被困在beam_update 函数中(在OpenNMT-py/onmt/decoders/decoder.py 文件中)。调用时:

sent_states.data.copy_( sent_states.data.index_select(1, positions))

根据.copy_函数的pythorch documentation,它将

将 src 中的元素复制到 self 张量中并返回 self。

但是,“self tensor”指的是什么?有人可以向我解释一下这个函数的作用或指向源代码,因为我找不到它......

【问题讨论】:

    标签: python machine-learning pytorch


    【解决方案1】:

    self 张量是你调用 copy_ 的张量。 在您的示例中,它是sent_states.data


    回答 cmets 中提出的问题:为什么 copy 的行为不像使用 = 分配一样

    .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
    

    tensor1tensor3的位置相同,而tensor2已经复制到新位置

    【讨论】:

    • 我也是这么想的,但是如果我用:sent_states.data = sent_states.data.index_select(1, positions) 代替那个调用,网络的行为就会不同。
    • 表现不同是什么意思?我在一个简单的最小示例上进行了尝试,它按预期工作。
    • 是的,抱歉,我没有提供任何说明。我想(如果我错了,请有人纠正我)beam_update函数必须更新beam状态,以确保翻译过程中的一致性。只有上面发布的修改,网络翻译是不同的(质量较低),我不明白为什么。
    • 是否有原因,为什么使用.data,而不是包装张量sent_states?那你不能打电话给sent_states = sent_states.index_select(1, positions)吗?
    • @francescopanini 我想我想通了并更新了我的答案
    猜你喜欢
    • 2020-09-15
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多