#python #pytorch
#python #pytorch
Вопрос:
Я все еще борюсь с PyTorch, поиграв некоторое время с Keras (что кажется намного более интуитивным). В любом случае — у меня есть приведенный ниже код модели nn.linear, который отлично работает только для одной функции ввода, где:
inputDim = 1
Сейчас я пытаюсь расширить тот же код, чтобы включить 2 функции, и поэтому я включил еще один столбец в свой фрейм данных функций, а также установил:
inputDim = 2
Однако, когда я запускаю код, я получаю страшную ошибку:
RuntimeError: mat1 dim 1 must match mat2 dim 0
Эта ошибка ссылается на строку 63, которая:
outputs = model(inputs)
Я просмотрел здесь несколько других сообщений, касающихся этой ошибки размерности, но я все еще не вижу, что не так с моим кодом. Любая помощь будет оценена.
Полный код выглядит так:
import numpy as np
import pandas as pd
import torch
from torch.autograd import Variable
import matplotlib.pyplot as plt
device = 'cuda' if torch.cuda.is_available() else 'cpu'
df = pd.read_csv('Adjusted Close - BAC-UBS-WFC.csv')
x = df[['BAC', 'UBS']]
y = df['WFC']
# number_of_features = x.shape[1]
# print(number_of_features)
x_train = np.array(x, dtype=np.float32)
x_train = x_train.reshape(-1, 1)
y_train = np.array(y, dtype=np.float32)
y_train = y_train.reshape(-1, 1)
class linearRegression(torch.nn.Module):
def __init__(self, inputSize, outputSize):
super(linearRegression, self).__init__()
self.linear = torch.nn.Linear(inputSize, outputSize)
def forward(self, x):
out = self.linear(x)
return out
inputDim = 2
outputDim = 1
learningRate = 0.01
epochs = 500
# Model instantiation
torch.manual_seed(42)
model = linearRegression(inputDim, outputDim)
if torch.cuda.is_available(): model.cuda()
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learningRate)
# Model training
loss_series = []
for epoch in range(epochs):
# Converting inputs and labels to Variable
inputs = Variable(torch.from_numpy(x_train).cuda())
labels = Variable(torch.from_numpy(y_train).cuda())
# Clear gradient buffers because we don't want any gradient from previous epoch to carry forward, dont want to cummulate gradients
optimizer.zero_grad()
# get output from the model, given the inputs
outputs = model(inputs)
# get loss for the predicted output
loss = criterion(outputs, labels)
loss_series.append(loss.item())
print(loss)
# get gradients w.r.t to parameters
loss.backward()
# update parameters
optimizer.step()
print('epoch {}, loss {}'.format(epoch, loss.item()))
# Calculate predictions on training data
with torch.no_grad(): # we don't need gradients in the testing phase
predicted = model(Variable(torch.from_numpy(x_train).cuda())).cpu().data.numpy()
Ответ №1:
Общий совет: для ошибок с размерностью обычно помогает выводить размеры на каждом шаге вычисления.
Скорее всего, в этом конкретном случае вы допустили ошибку, изменив ввод с помощью этого x_train = x_train.reshape(-1, 1)
Ваш ввод — (N,1)
это то, что ожидает NN (N,2)
.
Комментарии:
1. Еще раз спасибо. Я добавил этот фрагмент кода: » number_of_features = x.shape[1], input_shape = x.shape, output_shape = y.shape, x_train = np.array(x, dtype=np.float32), x_train = x_train.reshape(input_shape), y_train = np.array(y, dtype=np.float32), y_train = y_train.reshape(output_shape)», и теперь он работает отлично.