Метод is_contiguous
Метод is_contiguous проверяет, является ли тензор непрерывным в памяти. Непрерывность означает, что элементы тензора хранятся в оперативной памяти подряд без промежутков, в порядке, соответствующем его размерности. Это свойство влияет на производительность многих операций: например, view требует непрерывного тензора, а операции типа transpose или permute могут нарушать непрерывность. Метод возвращает логическое значение True или False.
Синтаксис
t.is_contiguous()
Метод не принимает аргументов.
Пример
Давайте создадим обычный тензор и проверим его непрерывность:
import torch
t = torch.tensor([1, 2, 3, 4, 5])
print(t.is_contiguous())
Результат выполнения кода:
True
Тензор, созданный напрямую из списка, всегда является непрерывным.
Пример
Теперь создадим двумерный тензор и применим к нему операцию transpose, которая нарушает непрерывность:
import torch
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
])
t_transposed = t.transpose(0, 1)
print(t_transposed.is_contiguous())
Результат выполнения кода:
False
После транспонирования тензор становится разреженным в памяти, и метод возвращает False.
Пример
Метод is_contiguous часто используется перед вызовом view, так как view требует непрерывного тензора:
import torch
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
])
t_transposed = t.transpose(0, 1)
if t_transposed.is_contiguous():
t_reshaped = t_transposed.view(-1)
else:
t_contiguous = t_transposed.contiguous()
t_reshaped = t_contiguous.view(-1)
print(t_reshaped)
Результат выполнения кода:
tensor([1, 4, 2, 5, 3, 6])
Если бы мы попытались применить view к t_transposed напрямую, получили бы ошибку. Метод is_contiguous помогает безопасно обработать эту ситуацию.
Пример
Рассмотрим, как метод contiguous делает тензор непрерывным:
import torch
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
])
t_transposed = t.transpose(0, 1)
print("После transpose:", t_transposed.is_contiguous())
t_contiguous = t_transposed.contiguous()
print("После contiguous:", t_contiguous.is_contiguous())
Результат выполнения кода:
После transpose: False
После contiguous: True
Метод contiguous создает новую копию тензора в непрерывном формате памяти.
Пример
Метод is_contiguous также работает с многомерными тензорами. Рассмотрим пример с permute:
import torch
t = torch.randn(2, 3, 4)
print("Исходный:", t.is_contiguous())
t_permuted = t.permute(2, 0, 1)
print("После permute:", t_permuted.is_contiguous())
Результат выполнения кода:
Исходный: True
После permute: False
Перестановка размерностей также нарушает непрерывность тензора.
Смотрите также
-
метод
contiguous,
который создает непрерывную копию тензора -
метод
view,
который изменяет форму тензора и требует непрерывности -
метод
transpose,
который меняет местами две размерности и нарушает непрерывность -
метод
permute,
который переставляет размерности и нарушает непрерывность