Атрибуты тензора
У каждого torch.Tensor есть torch.dtype, torch.device и torch.layout.
torch.dtype
-
class torch.dtype
Объект torch.dtype представляет тип данных torch.Tensor. В PyTorch есть двенадцать различных типов данных:
Тип данных | dtype | Старые конструкторы |
|---|---|---|
32-битное число с плавающей точкой |
|
|
64-битное число с плавающей точкой |
|
|
64-битное комплексное число |
| |
128-битное комплексное число |
| |
16-битное число с плавающей точкой [1] |
|
|
16-битное число с плавающей точкой [2] |
|
|
8-битное целое число (без знака) |
|
|
8-битное целое число (со знаком) |
|
|
16-битное целое число (со знаком) |
|
|
32-битное целое число (со знаком) |
|
|
64-битное целое число (со знаком) |
|
|
Булево |
|
|
Для определения, является ли 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