Тензор 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 скопирован в новое местоположение