Есть ли разница между torch.IntTensor и torch.Tensor

При использовании тензоров PyTorch есть ли смысл инициализировать мои данные следующим образом:

X_tensor: torch.IntTensor = torch.IntTensor(X)
Y_tensor: torch.IntTensor = torch.IntTensor(Y)

Или я должен просто сделать «стандарт»:

X_tensor: torch.Tensor = torch.Tensor(X)
Y_tensor: torch.Tensor = torch.Tensor(Y)

хотя я знаю X: list[list[int] и Y: list[list[int]

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используя torch.IntTensor() или torch.Tensor(), вы получите

  • либо тензор, который может содержать целые числа со знаком и требует 32 бита на значение
  • или тензор, который может содержать 32-битные числа с плавающей запятой, поскольку torch.Tensor возвращает (уважаемый псевдоним) a torch.FloatTensor.

С другой стороны, использование torch.tensor(X) (только с целыми числами в X) приведет к 64-битному целочисленному тензору по умолчанию, поскольку torch.tensor() автоматически определяет тип данных.

import torch

X = [[1, 2], [3, 4]]

x1 = torch.IntTensor(X)
x2 = torch.Tensor(X)
x3 = torch.tensor(X)

print(x1.dtype)  # torch.int32
print(x2.dtype)  # torch.float32
print(x3.dtype)  # torch.int64

Что вам нужно, зависит от того, что вы хотите делать с данными. Для вычислений в нейронных сетях обычно используются тензоры с 32-битной точностью с плавающей запятой.

Тем не менее, pytorch автоматически преобразует данные в более крупный тип, если типы данных смешиваются в вычислениях. Итак, это работает:

c = 3.1
print(x1*c, (x1*c).dtype)  # tensor([[ 3.1000,  6.2000], [ 9.3000, 12.4000]]) torch.float32
print(x2*c, (x2*c).dtype)  # tensor([[ 3.1000,  6.2000], [ 9.3000, 12.4000]]) torch.float32

Но это тоже работает (хотя результат "неправильный" (округленный) - так что лучше сразу начать с требуемой точности).

data_float32 = torch.tensor([0.1, 0.2, 0.3])
data_int16 = data_float32.to(torch.short)
data_squared = data_float32 * data_int16
print(data_squared, data_squared.dtype)  # tensor([0., 0., 0.]) torch.float32

Просто небольшой вопрос, torch.short кодирует его в 16 бит, но это не обязательно означает, что у нас будет целое число?

FluidMechanics Potential Flows 16.01.2023 13:10

После прочтения документации (pytorch.org/docs/stable/generated/torch.Tensor.short.html) кажется, что дело в этом. Однако нельзя ли закодировать число с плавающей запятой с точностью 16?

FluidMechanics Potential Flows 16.01.2023 13:16

float с точностью 16 будет torch.half (половина точности с плавающей запятой). Преобразование можно сделать так (на примере выше): data_float32.to(torch.half). Или для прямой инициализации тензора float16: torch.tensor(X, dtype=torch.float16)

rosa b. 16.01.2023 13:38

Просто нужно было преобразовать в целочисленный тензор для приведенного выше примера, чтобы подчеркнуть, что автоматическое преобразование может привести к ошибкам. Извините, если это вызвало путаницу.

rosa b. 16.01.2023 13:40

Ок, теперь очень ясно!

FluidMechanics Potential Flows 16.01.2023 13:50
  • torch.IntTensor(X): возвращает тензор int32
  • torch.Tensor(X): возвращает тензор float32

Что использовать, зависит от того, что ожидает ваша форвардная функция, особенно ваша функция потерь. Большинство функций потерь работают с тензорами с плавающей запятой.

Другие вопросы по теме