Почему Pytorch выдает мне ошибку типа данных: Float vs Double?

#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)
  

Спасибо!

Теперь я могу перейти к следующему сбою 🙂