Как устранить ошибку несоответствия размеров в Python (Pytorch) - PullRequest
0 голосов
/ 13 апреля 2020

В настоящее время я работаю над многомерной линейной регрессией с использованием PyTorch, и я получаю следующую ошибку, я действительно много искал об этой ошибке, и единственное, что я узнал, - это несоответствие размера между данными и метками. Но как решить эту ошибку. Пожалуйста, помогите мне или покажите мне правильный способ решения этой проблемы.

несоответствие размера, м1: [824 x 1], м2: [8 x 8]

import torch
import torch.nn as nn
import numpy as np


Xtr = np.loadtxt("TrainData.csv")
Ytr = np.loadtxt("TrainLabels.csv")


X_train = torch.FloatTensor(Xtr)
Y_train = torch.FloatTensor(Ytr)

#### MODEL ARCHITECTURE #### 

class Model(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(8,8)
        self.lin2 = torch.nn.Linear(8,1)

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

model = Model()

loss_func = nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
#print(len(list(model.parameters())))
def count_params(model): 
    return sum(p.numel() for p in model.parameters() if p.requires_grad)

### TRAINING 
for epoch in range(2):
    y_pred = model(X_train)

    loss = loss_func(y_pred, Y_train)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    count = count_params(model)
    print(count)

test_exp = torch.FloatTensor([[6.0]])

1 Ответ

0 голосов
/ 29 апреля 2020

Похоже, порядок операций в вашем прямом проходе неверен. Краткий ответ - поменяйте их местами, как показано ниже. Больше контекста о различных формах ниже.

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

Должно быть:

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

При условии, что у вас 8 функций и некоторый размер пакета N ваши входные данные для прямого прохода будут иметь размер (N x 8). После того, как вы пройдете через lin2, он будет иметь форму (N x 1). Узел linear ожидает ввод с формой (N x 8), но получает (N x 1), следовательно, ошибка.

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