В соответствии с ошибкой, я считаю, что ваши данные не правильно отформатированы.Тензор должен быть в форме [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]))