Функция clone
Функция clone создает новый тензор, который является полной копией исходного тензора с собственным выделенным хранилищем данных. Это означает, что изменения в копии не влияют на оригинал, и наоборот. Метод не принимает аргументов и возвращает новый тензор с теми же размерами, типом данных и устройством, что и у исходного тензора.
Важно отметить, что clone всегда выполняет глубокое копирование данных, в отличие от операции присваивания или методов detach и as_tensor, которые могут создавать представления или разделять память с исходным тензором.
Синтаксис
tensor.clone()
Пример
Создадим простой тензор и сделаем его полную копию с помощью метода clone:
import torch
t = torch.tensor([1, 2, 3, 4, 5])
t_clone = t.clone()
print("Original:", t)
print("Clone: ", t_clone)
Результат выполнения кода:
Original: tensor([1, 2, 3, 4, 5])
Clone: tensor([1, 2, 3, 4, 5])
Пример
Продемонстрируем, что копия полностью независима от оригинала. Изменим значение в копии и убедимся, что исходный тензор не изменился:
import torch
t = torch.tensor([1, 2, 3, 4, 5])
t_clone = t.clone()
t_clone[0] = 100
print("Original after clone modification:", t)
print("Clone after modification: ", t_clone)
Результат выполнения кода:
Original after clone modification: tensor([1, 2, 3, 4, 5])
Clone after modification: tensor([100, 2, 3, 4, 5])
Пример
Метод clone сохраняет все атрибуты тензора, включая тип данных и устройство. Скопируем тензор на GPU (если доступен) и проверим его устройство:
import torch
if torch.cuda.is_available():
t = torch.tensor([1, 2, 3, 4, 5], device='cuda')
t_clone = t.clone()
print("Original device:", t.device)
print("Clone device: ", t_clone.device)
else:
print("CUDA is not available")
Результат выполнения кода:
Original device: cuda:0
Clone device: cuda:0
Пример
Важно помнить, что clone создает новый тензор даже для тензоров, которые сами являются представлениями других тензоров. Это часто используется для создания непрерывной копии данных после операций перестановки размерностей:
import torch
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
])
t_transposed = t.transpose(0, 1)
t_clone = t_transposed.clone()
print("Is transposed contiguous:", t_transposed.is_contiguous())
print("Is clone contiguous: ", t_clone.is_contiguous())
t_clone[0, 0] = 99
print("Original after clone modification:\n", t)
Результат выполнения кода:
Is transposed contiguous: False
Is clone contiguous: True
Original after clone modification:
tensor([
[1, 2, 3],
[4, 5, 6],
])
Смотрите также
-
метод
detach,
который создает тензор, отсоединенный от вычислительного графа, но разделяющий память -
функцию
as_tensor,
которая преобразует данные в тензор без лишнего копирования по возможности -
функцию
tensor,
которая создает тензор из списка или массива, копируя данные -
функцию
from_numpy,
которая создает тензор из массива NumPy, разделяя память