Spec-Zone.ru › PyTorch 1

Атрибуты тензора

У каждого torch.Tensor есть torch.dtype, torch.device и torch.layout.

torch.dtype

class torch.dtype

Объект torch.dtype представляет тип данных torch.Tensor. В PyTorch есть двенадцать различных типов данных:

Тип данных

dtype

Старые конструкторы

32-битное число с плавающей точкой

torch.float32 или torch.float

torch.*.FloatTensor

64-битное число с плавающей точкой

torch.float64 или torch.double

torch.*.DoubleTensor

64-битное комплексное число

torch.complex64 или torch.cfloat

128-битное комплексное число

torch.complex128 или torch.cdouble

16-битное число с плавающей точкой [1]

torch.float16 или torch.half

torch.*.HalfTensor

16-битное число с плавающей точкой [2]

torch.bfloat16

torch.*.BFloat16Tensor

8-битное целое число (без знака)

torch.uint8

torch.*.ByteTensor

8-битное целое число (со знаком)

torch.int8

torch.*.CharTensor

16-битное целое число (со знаком)

torch.int16 или torch.short

torch.*.ShortTensor

32-битное целое число (со знаком)

torch.int32 или torch.int

torch.*.IntTensor

64-битное целое число (со знаком)

torch.int64 или torch.long

torch.*.LongTensor

Булево

torch.bool

torch.*.BoolTensor

[1]

Иногда упоминается как binary16: использует 1 бит для знака, 5 битов для экспоненты и 10 битов для мантиссы. Полезно, когда важна точность.

[2]

Иногда упоминается как Brain Floating Point: использует 1 бит для знака, 8 битов для экспоненты и 7 битов для мантиссы. Полезно, когда важен диапазон, так как имеет такое же количество битов для экспоненты, как float32

Для определения, является ли torch.dtype типом данных с плавающей точкой, можно использовать свойство is_floating_point, которое возвращает True если тип данных является типом данных с плавающей точкой.

Для определения, является ли torch.dtype типом данных комплексного числа, можно использовать свойство is_complex, которое возвращает True если тип данных является типом данных комплексного числа.

Когда типы данных входных данных арифметической операции (add, sub, div, mul) отличаются, мы производим повышение, найдя минимальный тип данных, который удовлетворяет следующим правилам:

  • Если тип скалярного операнда относится к более высокой категории, чем операнды тензора (где комплексное число > число с плавающей точкой > целое число > булево), мы повышаем до типа с достаточным размером для хранения всех скалярных операндов этой категории.
  • Если операнд тензора нулевой размерности имеет более высокую категорию, чем операнды с размерностью, мы повышаем до типа с достаточным размером и категорией для хранения всех операндов тензора нулевой размерности этой категории.
  • Если нет операндов нулевой размерности с более высокой категорией, мы повышаем до типа с достаточным размером и категорией для хранения всех операндов с размерностью.

Скалярный операнд с плавающей точкой имеет тип torch.get_default_dtype(), а скалярный операнд целого типа (не булевый) имеет тип torch.int64. В отличие от numpy, при определении минимального dtypes операнда мы не проверяем значения. Квантованные и комплексные типы пока не поддерживаются.

Примеры повышения:

>>> float_tensor = torch.ones(1, dtype=torch.float)
>>> double_tensor = torch.ones(1, dtype=torch.double)
>>> complex_float_tensor = torch.ones(1, dtype=torch.complex64)
>>> complex_double_tensor = torch.ones(1, dtype=torch.complex128)
>>> int_tensor = torch.ones(1, dtype=torch.int)
>>> long_tensor = torch.ones(1, dtype=torch.long)
>>> uint_tensor = torch.ones(1, dtype=torch.uint8)
>>> double_tensor = torch.ones(1, dtype=torch.double)
>>> bool_tensor = torch.ones(1, dtype=torch.bool)
# zero-dim tensors
>>> long_zerodim = torch.tensor(1, dtype=torch.long)
>>> int_zerodim = torch.tensor(1, dtype=torch.int)

>>> torch.add(5, 5).dtype
torch.int64
# 5 is an int64, but does not have higher category than int_tensor so is not considered.
>>> (int_tensor + 5).dtype
torch.int32
>>> (int_tensor + long_zerodim).dtype
torch.int32
>>> (long_tensor + int_tensor).dtype
torch.int64
>>> (bool_tensor + long_tensor).dtype
torch.int64
>>> (bool_tensor + uint_tensor).dtype
torch.uint8
>>> (float_tensor + double_tensor).dtype
torch.float64
>>> (complex_float_tensor + complex_double_tensor).dtype
torch.complex128
>>> (bool_tensor + int_tensor).dtype
torch.int32
# Since long is a different kind than float, result dtype only needs to be large enough
# to hold the float.
>>> torch.add(long_tensor, float_tensor).dtype
torch.float32
When the output tensor of an arithmetic operation is specified, we allow casting to its dtype except that:
  • Тензор целочисленного результата не может принимать тензор с плавающей точкой.
  • Тензор булевого результата не может принимать тензор, не являющийся булевым.
  • Тензор, не являющийся комплексным, не может принимать комплексный тензор.

Примеры преобразования:

# allowed:
>>> float_tensor *= float_tensor
>>> float_tensor *= int_tensor
>>> float_tensor *= uint_tensor
>>> float_tensor *= bool_tensor
>>> float_tensor *= double_tensor
>>> int_tensor *= long_tensor
>>> int_tensor *= uint_tensor
>>> uint_tensor *= int_tensor

# disallowed (RuntimeError: result type can't be cast to the desired output type):
>>> int_tensor *= float_tensor
>>> bool_tensor *= int_tensor
>>> bool_tensor *= uint_tensor
>>> float_tensor *= complex_float_tensor

torch.device

class torch.device

Объект torch.device представляет устройство, на котором расположен или будет расположен torch.Tensor.

Объект torch.device содержит тип устройства ('cpu' или 'cuda') и необязательный порядковый номер устройства для типа устройства. Если порядковый номер устройства отсутствует, этот объект всегда будет представлять текущее устройство для типа устройства, даже после вызова torch.cuda.set_device(); например, torch.Tensor, созданный с устройством 'cuda', эквивалентен 'cuda:X', где X является результатом torch.cuda.current_device().

Устройство torch.Tensor можно получить через свойство Tensor.device.

Объект torch.device можно создать с помощью строки или с помощью строки и порядкового номера устройства.

С помощью строки:

>>> torch.device('cuda:0')
device(type='cuda', index=0)

>>> torch.device('cpu')
device(type='cpu')

>>> torch.device('cuda')  # current cuda device
device(type='cuda')

С помощью строки и порядкового номера устройства:

>>> torch.device('cuda', 0)
device(type='cuda', index=0)

>>> torch.device('cpu', 0)
device(type='cpu', index=0)

Примечание

Аргумент torch.device в функциях обычно можно заменить строкой. Это позволяет быстро прототипировать код.

>>> # Example of a function that takes in a torch.device
>>> cuda1 = torch.device('cuda:1')
>>> torch.randn((2,3), device=cuda1)
>>> # You can substitute the torch.device with a string
>>> torch.randn((2,3), device='cuda:1')

Примечание

По историческим причинам устройство можно создать с помощью единственного порядкового номера устройства, который обрабатывается как устройство CUDA. Это соответствует Tensor.get_device(), который возвращает порядковый номер для тензоров CUDA и не поддерживается для тензоров CPU.

>>> torch.device(1)
device(type='cuda', index=1)

Примечание

Методы, которые принимают устройство, обычно принимают строку (в правильном формате) или (по старой традиции) порядковый номер устройства, т.е. следующие варианты являются равнозначными:

>>> torch.randn((2,3), device=torch.device('cuda:1'))
>>> torch.randn((2,3), device='cuda:1')
>>> torch.randn((2,3), device=1)  # legacy

torch.layout

class torch.layout

Предупреждение

Класс torch.layout находится на стадии бета-тестирования и может быть изменён.

Объект torch.layout представляет расположение памяти torch.Tensor. В настоящее время мы поддерживаем torch.strided (плотные тензоры) и имеем поддержку в бета-версии torch.sparse_coo (разреженные тензоры COO).

torch.strided представляет плотные тензоры и является расположением памяти, которое чаще всего используется. Каждый строенный тензор имеет связанное torch.Storage, которое хранит его данные. Эти тензоры обеспечивают многомерный строенный вид хранилища. Шаги — это список целых чисел: k-й шаг представляет собой скачок в памяти, необходимый для перехода от одного элемента к следующему в k-м измерении тензора. Это понятие позволяет эффективно выполнять многие операции с тензорами.

Пример:

>>> x = torch.tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)

>>> x.t().stride()
(1, 5)

Для получения дополнительной информации о тензорах torch.sparse_coo см. torch.sparse.

torch.memory_format

class torch.memory_format

Объект torch.memory_format представляет собой формат памяти, в котором расположен или будет расположен torch.Tensor.

Возможные значения:

  • torch.contiguous_format: Тензор расположен или будет расположен в плотной неперекрывающейся памяти. Шаги представлены значениями в порядке убывания.
  • torch.channels_last: Тензор расположен или будет расположен в плотной неперекрывающейся памяти. Шаги представлены значениями в strides[0] > strides[2] > strides[3] > strides[1] == 1 порядке (NHWC).
  • torch.channels_last_3d: Тензор расположен или будет расположен в плотной неперекрывающейся памяти. Шаги представлены значениями в strides[0] > strides[2] > strides[3] > strides[4] > strides[1] == 1 порядке (NDHWC).
  • torch.preserve_format: Используется в функциях, таких как clone, для сохранения формата памяти входного тензора. Если входной тензор расположен в плотной неперекрывающейся памяти, шаги выходного тензора будут скопированы из входного. В противном случае шаги выхода будут следовать torch.contiguous_format

© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/1.13/tensor_attributes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API