При использовании тензоров 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]






Используя torch.IntTensor() или torch.Tensor(), вы получите
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
После прочтения документации (pytorch.org/docs/stable/generated/torch.Tensor.short.html) кажется, что дело в этом. Однако нельзя ли закодировать число с плавающей запятой с точностью 16?
float с точностью 16 будет torch.half (половина точности с плавающей запятой). Преобразование можно сделать так (на примере выше): data_float32.to(torch.half). Или для прямой инициализации тензора float16: torch.tensor(X, dtype=torch.float16)
Просто нужно было преобразовать в целочисленный тензор для приведенного выше примера, чтобы подчеркнуть, что автоматическое преобразование может привести к ошибкам. Извините, если это вызвало путаницу.
Ок, теперь очень ясно!
torch.IntTensor(X): возвращает тензор int32torch.Tensor(X): возвращает тензор float32Что использовать, зависит от того, что ожидает ваша форвардная функция, особенно ваша функция потерь. Большинство функций потерь работают с тензорами с плавающей запятой.
Просто небольшой вопрос,
torch.shortкодирует его в 16 бит, но это не обязательно означает, что у нас будет целое число?