Метод unsqueeze_
Метод unsqueeze_ добавляет новое измерение в тензор на указанной позиции, изменяя исходный тензор непосредственно на месте. В отличие от метода unsqueeze, который возвращает новый тензор, данная версия модифицирует сам объект, экономя память при работе с большими данными. Метод принимает один обязательный параметр - позицию, на которой будет вставлено новое измерение.
Синтаксис
tensor.unsqueeze_(dim)
Параметр dim определяет позицию для вставки нового измерения. Отрицательные значения отсчитываются от конца, например -1 означает последнюю позицию.
Пример
Давайте создадим одномерный тензор и добавим новое измерение в начало:
import torch
t = torch.tensor([1, 2, 3, 4, 5])
print(f"Размер до: {t.shape}")
t.unsqueeze_(0)
print(f"Размер после: {t.shape}")
print(t)
Результат выполнения кода:
Размер до: torch.Size([5])
Размер после: torch.Size([1, 5])
tensor([[1, 2, 3, 4, 5]])
Пример
Добавим измерение в конец тензора с помощью отрицательного индекса:
import torch
t = torch.tensor([1, 2, 3, 4, 5])
print(f"Размер до: {t.shape}")
t.unsqueeze_(-1)
print(f"Размер после: {t.shape}")
print(t)
Результат выполнения кода:
Размер до: torch.Size([5])
Размер после: torch.Size([5, 1])
tensor([[1],
[2],
[3],
[4],
[5]])
Пример
Добавим измерение в середину двумерного тензора:
import torch
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
])
print(f"Размер до: {t.shape}")
t.unsqueeze_(1)
print(f"Размер после: {t.shape}")
print(t)
Результат выполнения кода:
Размер до: torch.Size([2, 3])
Размер после: torch.Size([2, 1, 3])
tensor([
[[1, 2, 3]],
[[4, 5, 6]],
])
Пример
Покажем отличие от версии без нижнего подчёркивания:
import torch
t = torch.tensor([1, 2, 3, 4, 5])
t_copy = t.unsqueeze(0)
print(f"Исходный тензор: {t.shape}")
print(f"Новый тензор: {t_copy.shape}")
print(f"Это один объект? {t is t_copy}")
Результат выполнения кода:
Исходный тензор: torch.Size([5])
Новый тензор: torch.Size([1, 5])
Это один объект? False