Pytorch: как форматировать данные перед выполнением машинного обучения - PullRequest
0 голосов
/ 20 мая 2018

Я изучаю, как использовать pytorch, и я смог понять весь процесс построения и исполнения моделей ML.Однако я не могу понять, как «отформатировать» или «изменить» данные перед выполнением модели.Я продолжаю получать ошибки, такие как:

RuntimeError: несоответствие размера, m1: [1 x 700], m2: [1 x 1] в c: \ programdata \ miniconda3 \ conda-bld \ pytorch_1524543037166 \ work\ aten \ src \ th \ generic / THTensorMath.c: 2033

Или

Ожидаемый объект типа Variable [torch.DoubleTensor], но найденный тип Variable [torch.FloatTensor] для аргумента # 1 'mat2'

Итак, у меня есть CSV-файл с именем "train.csv" с атрибутами, называемыми "x" и "y", и в нем 700 образцов,Я хочу выполнить простую линейную регрессию с данными и анализировать данные с помощью панд. Как мне отформатировать или изменить форму данных так, чтобы они выполнялись гладко?Как Pytorch выполняет итерацию по входным данным?

Последний код, который я выполнил:

import torch
import torch.nn as nn
from torch.autograd import Variable
import pandas as pd

class Linear_Reg(nn.Module):
    def __init__(self, inp_sz, out_sz):    
        super(Linear_Reg, self).__init__()
        self.linear = nn.Linear(inp_sz, out_sz)

    def forward(self, x):
        out = self.linear(x)
        return out

train = pd.read_csv('C:\\Users\\hgstr\\Jupyter_Files\\Data_Sets\\linear_regression\\train.csv')
test = pd.read_csv('C:\\Users\\hgstr\\Jupyter_Files\\Data_Sets\\linear_regression\\test.csv')

x_train = torch.Tensor(train['x'])
y_train = torch.Tensor(train['y'])

x_test = torch.Tensor(test['x'])
y_test = torch.Tensor(test['y'])

x_train = torch.Tensor(x_train)
x_train = x_train.view(1,-1)

#================================
input_sz = 1;
output_sz = 1
epochs = 60
learning_rate = 0.001
#================================

model = Linear_Reg(input_sz, output_sz)
crit = nn.MSELoss()
opt = torch.optim.SGD(model.parameters(), learning_rate)

for e in range(epochs):

    opt.zero_grad()
    out = model(x_train)

    loss = crit(out, y_train)
    loss.backward()
    opt.step()

    print('epoch {}, loss {}'.format(e,loss.data[0]))

И он выдал следующее:

RuntimeError: несоответствие размера, m1: [1 x 700], м2: [1 x 1] в c: \ programdata \ miniconda3 \ conda-bld \ pytorch_1524543037166 \ work \ aten \ src \ th \ generic / THTensorMath.c: 2033

Решения?

1 Ответ

0 голосов
/ 21 мая 2018

В соответствии с ошибкой, я считаю, что ваши данные не правильно отформатированы.Тензор должен быть в форме [700, 2] (batch x data), а ваш - [1, 700] (data x batch).Это заставляет модель «думать», что вы добавляете только одну запись в качестве обучения с 700 функциями вместо 700 записей с только 1 функцией.

Изменение формы переменной x_train должно заставить код работать.Просто удалите строку x_train = x_train.view(1,-1).

. Что касается второй ошибки, может случиться так, что после чтения .csv в переменную его тип будет Double (из-за pd.read_csv), а в pytorch по умолчанию создаются тензоры.как плавает.Я думаю, что приведения ваших входных данных перед подачей их в модель должно быть достаточно: model(x_train.float()) или указание в части создания Tensor x_train = torch.FloatTensor(train['x']).Обратите внимание, что вы должны разыграть все Тензоры, которые не являются Плавающими.

edit: этот фрагмент кода работает для меня

import torch
import torch.nn as nn
import pandas as pd

class Linear_Reg(nn.Module):
    def __init__(self, inp_sz, out_sz):
        super(Linear_Reg, self).__init__()
        self.linear = nn.Linear(inp_sz, out_sz)

    def forward(self, x):
        out = self.linear(x)
        return out


train = pd.read_csv('yourpath')
test = pd.read_csv('yourpath')

x_train = torch.Tensor(train['x']).to(torch.float).view(700, 1)
y_train = torch.Tensor(train['y']).to(torch.float).view(700, 1)

x_test = torch.Tensor(test['x']).to(torch.float).view(300, 1)
y_test = torch.Tensor(test['y']).to(torch.float).view(300, 1)

# ================================
input_sz = 1;
output_sz = 1
epochs = 60
learning_rate = 0.001
# ================================

model = Linear_Reg(input_sz, output_sz)
crit = nn.MSELoss()
opt = torch.optim.SGD(model.parameters(), learning_rate)

for e in range(epochs):
    opt.zero_grad()
    out = model(x_train)

    loss = crit(out, y_train)
    loss.backward()
    opt.step()

    print('epoch {}, loss {}'.format(e, loss.data[0]))
...