#python #types #pytorch
#python #типы #pytorch
Вопрос:
Я работаю над переносом некоторого рабочего кода Pytorch, который я нашел в Интернете (который представляет собой пример классификации 2D-изображений с использованием данных MNIST; извиняюсь, что я потерял след исходного источника и не могу его найти), в то, что мне нужно, а именно преобразование одномерной коллекции значений в числовую оценку. Я создал свой собственный класс Dataset. Когда я вызываю model(), я получаю сообщение об ошибке : RuntimeError: Expected object of scalar type Float but got scalar type Double for argument #2 'mat1' in call to _th_addmm
. Мой первый уровень путаницы заключается в том, что я не могу найти ни одной ссылки на Python, даже имеющей двойной тип данных. И вторая причина, по которой я получаю ошибку — когда я ввожу отладочный код, чтобы показать тип данных mat1 и его элементы, мне говорят, что это тензор, который утверждает, что он равен float64. Мне также интересно, почему он ожидает скаляр для mat1, который в документации описывается как матрица / тензор.
Полный дамп ошибок
Traceback (most recent call last):
File "mlalan.py", line 174, in <module>
outputs = model(images)
File "/usr/home/adf/.local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
result = self.forward(*input, **kwargs)
File "mlalan.py", line 80, in forward
x = activate(self.fc1(x))
File "/usr/home/adf/.local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
result = self.forward(*input, **kwargs)
File "/usr/home/adf/.local/lib/python3.7/site-packages/torch/nn/modules/linear.py", line 87, in forward
return F.linear(input, self.weight, self.bias)
File "/usr/home/adf/.local/lib/python3.7/site-packages/torch/nn/functional.py", line 1610, in linear
ret = torch.addmm(bias, input, weight.t())
RuntimeError: Expected object of scalar type Float but got scalar type Double for argument #2 'mat1' in call to _th_addmm
Часть ключевого кода из моего класса Dataset
class RandomDataset(Dataset):
def __init__(self, csv_file, transform=None):
self.data_frame = pd.read_csv(csv_file, dtype=float)
def __getitem__(self, idx):
raw = self.data_frame.values[idx]
sample = raw[0:6], raw[6:8]
return sample
Полный исходный код находится по адресу http://8wheels.org/mlalan.py .
Комментарии:
1. Попробуйте превратить его в float, float(num)
2. Кстати, float64 равен Double; Float равен float32. Pandas, вероятно, загружает данные с двойной точностью.
3. Для вашей модели требуется FloatTensor . Вызов (some_tensor). float() для любых тензоров, которые вводятся в качестве входных данных для вашего экземпляра nn.Module.
Ответ №1:
По умолчанию в Python float означает float32 . Однако в Pandas и Numpy float означает float64 . Я смог решить проблему, добавив вызов astype, как показано ниже. Для его работы требуется «32».
raw = self.data_frame.values[idx].astype(np.float32)
Спасибо!
Теперь я могу перейти к следующему сбою 🙂