Метод copy_
Метод copy_ класса Tensor выполняет копирование данных из другого тензора в текущий тензор. В отличие от операции присваивания, которая просто создаёт ссылку на новый объект, метод copy_ изменяет содержимое существующего тензора, перезаписывая его значения. Метод работает на месте (in-place), то есть изменяет сам объект, а не создаёт новый. При этом копируемый тензор должен иметь совместимую форму, либо можно использовать параметр broadcast для включения механизма широковещания.
Метод принимает один обязательный параметр - тензор-источник src. Также есть необязательный параметр non_blocking, который указывает, следует ли выполнять копирование асинхронно для тензоров на GPU. Важно отметить, что после выполнения метода исходный тензор и целевой тензор могут находиться на разных устройствах, но тогда необходимо, чтобы копирование между устройствами было возможным.
Синтаксис
t.copy_(src, non_blocking=False)
Пример
Давайте создадим два тензора и скопируем данные из второго в первый:
import torch
t = torch.tensor([1, 2, 3, 4, 5])
src = torch.tensor([10, 20, 30, 40, 50])
t.copy_(src)
print(t)
Результат выполнения кода:
tensor([10, 20, 30, 40, 50])
Как видите, данные тензора t были полностью перезаписаны значениями из тензора src.
Пример
Метод copy_ позволяет копировать тензоры разных типов данных, автоматически преобразуя их:
import torch
t = torch.tensor([1, 2, 3], dtype=torch.float)
src = torch.tensor([4, 5, 6], dtype=torch.int)
t.copy_(src)
print(t)
print(t.dtype)
Результат выполнения кода:
tensor([4., 5., 6.])
torch.float32
Тип данных целевого тензора сохранился, а значения из источника были преобразованы в соответствующий тип.
Пример
Важно отметить, что формы тензоров должны быть совместимы. Попытка копирования тензора другой формы приведёт к ошибке:
import torch
t = torch.tensor([1, 2, 3])
src = torch.tensor([4, 5, 6, 7])
try:
t.copy_(src)
except RuntimeError as e:
print(e)
Результат выполнения кода:
"The expanded size of the tensor (3) must match the existing size (4) at non-singleton dimension 0. Target sizes: [3]. Tensor sizes: [4]"
В этом случае возникает ошибка, так как размеры тензоров не совпадают.
Пример
Метод copy_ можно использовать для копирования данных между разными устройствами, например, с CPU на GPU:
import torch
t = torch.zeros(3, device='cuda')
src = torch.tensor([1, 2, 3], device='cpu')
t.copy_(src)
print(t)
print(t.device)
Результат выполнения кода:
tensor([1., 2., 3.], device='cuda:0')
cuda:0
Данные были скопированы с CPU на GPU, целевой тензор остался на своём устройстве.
Пример
Метод copy_ возвращает ссылку на изменённый тензор, что позволяет использовать его в цепочках методов:
import torch
t = torch.tensor([1, 2, 3])
src = torch.tensor([4, 5, 6])
res = t.copy_(src)
print(res)
print(res is t)
Результат выполнения кода:
tensor([4, 5, 6])
True
Как видите, метод возвращает сам изменённый тензор, а не его копию.