Атрибут is_contiguous
Атрибут is_contiguous класса Tensor представляет собой булево значение, которое показывает, хранятся ли данные тензора в оперативной памяти непрерывным блоком в том порядке, в котором они перечисляются при итерации по тензору. По умолчанию все тензоры, созданные через torch.tensor или большинство операций, являются непрерывными. Однако такие операции, как transpose, permute или narrow, могут создавать представления, которые не являются непрерывными.
Непрерывность важна для производительности, поскольку многие низкоуровневые операции в PyTorch ожидают непрерывные тензоры для эффективной работы. Если тензор не является непрерывным, многие операции неявно вызывают contiguous, что может привести к дополнительным накладным расходам на копирование данных.
Синтаксис
tensor.is_contiguous()
Атрибут не принимает аргументов и возвращает логическое значение True, если тензор непрерывен, и False в противном случае.
Пример
Давайте создадим обычный тензор и проверим его непрерывность:
import torch
t = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(t.is_contiguous())
Результат выполнения кода:
True
Пример
Транспонирование тензора нарушает непрерывность, так как изменяется порядок доступа к элементам:
import torch
t = torch.tensor([[1, 2, 3], [4, 5, 6]])
t_transposed = t.transpose(0, 1)
print(t_transposed.is_contiguous())
Результат выполнения кода:
False
Пример
Метод contiguous создаёт копию тензора, данные которой расположены непрерывно:
import torch
t = torch.tensor([[1, 2, 3], [4, 5, 6]])
t_transposed = t.transpose(0, 1)
t_contiguous = t_transposed.contiguous()
print(t_contiguous.is_contiguous())
Результат выполнения кода:
True
Пример
Рассмотрим ситуацию, когда неявное приведение к непрерывному виду может произойти автоматически:
import torch
t = torch.tensor([[1, 2, 3], [4, 5, 6]])
t_transposed = t.transpose(0, 1)
res = t_transposed.view(-1) # view требует непрерывный тензор
print(res)
Результат выполнения кода:
RuntimeError: view size is not compatible with input tensor's size and stride.
В этом примере метод view не может быть применён к не непрерывному тензору. Чтобы исправить ошибку, нужно сначала сделать тензор непрерывным:
import torch
t = torch.tensor([[1, 2, 3], [4, 5, 6]])
t_transposed = t.transpose(0, 1)
t_contiguous = t_transposed.contiguous()
res = t_contiguous.view(-1)
print(res)
Результат выполнения кода:
tensor([1, 4, 2, 5, 3, 6])
Смотрите также
-
метод
contiguous,
который создаёт непрерывную копию тензора -
метод
transpose,
который меняет местами две оси тензора -
метод
view,
который изменяет форму тензора без копирования данных -
метод
reshape,
который изменяет форму тензора с возможным копированием