Проблема OpenNMT с PyTorch: функция .copy_ не ясное поведение - PullRequest
0 голосов
/ 03 июля 2018

Я работаю с PyTorch-версией OpenNMT и пытаюсь изменить алгоритм поиска луча. В настоящее время я застрял в функции beam_update (в файле OpenNMT-py / onmt / decoders / decoder.py ). Когда это называется:

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

в соответствии с документацией питора функции .copy_ это будет

Копирует элементы из src в собственный тензор и возвращает себя.

Но, что означает " собственный тензор "? Может кто-нибудь объяснить мне, что делает эта функция, или указать мне исходный код, так как я не могу его найти ...

1 Ответ

0 голосов
/ 03 июля 2018

Тензор self - это тензор, который вы называете copy_. В вашем примере это sent_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 одинаково, а тензор2 скопирован в новое местоположение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...