pytorch RuntimeError: Ожидаемый объект скалярного типа Double, но получил скалярный тип Float - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь реализовать пользовательский набор данных для моей нейронной сети. Но получил эту ошибку при запуске функции вперед. Код выглядит следующим образом.

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader
import numpy as np

class ParamData(Dataset):
    def __init__(self,file_name):
        self.data = torch.Tensor(np.loadtxt(file_name,delimiter = ','))    #first place
    def __len__(self):
        return self.data.size()[0]
    def __getitem__(self,i):
        return self.data[i]

class Net(nn.Module):
    def __init__(self,in_size,out_size,layer_size=200):
        super(Net,self).__init__()
        self.layer = nn.Linear(in_size,layer_size)
        self.out_layer = nn.Linear(layer_size,out_size)

    def forward(self,x):
        x = F.relu(self.layer(x))
        x = self.out_layer(x)
        return x

datafile = 'data1.txt'

net = Net(100,1)
dataset = ParamData(datafile)
n_samples = len(dataset)

#dataset = torch.Tensor(dataset,dtype=torch.double)   #second place
#net.float()                                          #thrid place

net.forward(dataset[0])         #fourth place

В файле data1.txt находится текстовый файл в формате csv, содержащий определенные числа, и каждый dataset[i] представляет собой объект размером 100 на 1 torch.Tensor объекта dtype * 1007. *. Сообщение об ошибке выглядит следующим образом:

Traceback (most recent call last):
  File "Z:\Wrong.py", line 33, in <module>
    net.forward(dataset[0])
  File "Z:\Wrong.py", line 23, in forward
    x = F.relu(self.layer(x))
  File "E:\Python38\lib\site-packages\torch\nn\modules\module.py", line 532, in __call__
    result = self.forward(*input, **kwargs)
  File "E:\Python38\lib\site-packages\torch\nn\modules\linear.py", line 87, in forward
    return F.linear(input, self.weight, self.bias)
  File "E:\Python38\lib\site-packages\torch\nn\functional.py", line 1372, in linear
    output = input.matmul(weight.t())
RuntimeError: Expected object of scalar type Double but got scalar type Float for argument #2 'mat2' in call to _th_mm

Похоже, мне следует изменить тип d чисел в dataset на torch.double. Я пробовал что-то вроде

  • , меняя строку на первом месте на self.data = torch.tensor(np.loadtxt(file_name,delimiter = ','),dtype=torch.double)

  • , меняя строку на четвертом месте на net.forward(dataset[0].double())

  • раскомментирование одной из двух строк во втором или третьем месте

Я думаю, что это решения, которые я видел из аналогичных вопросов, но они либо дают новые ошибки или ничего не делать Что я должен делать?


Обновление: Так что я получил его, изменив первое место на

self.data = torch.from_numpy(np.loadtxt(file_name,delimiter = ',')).float()

, что странно, потому что это точно напротив сообщения об ошибке. Это ошибка? Я все еще хотел бы кое-что объяснить.

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