различная форма выходных данных при запуске метода forward() PyTorch NN

#python #pytorch

Вопрос:

Здравствуйте, я пытаюсь понять следующее:

Я создал следующую модель нейронной сети, используя PyTorch ее для выполнения задачи регрессии.

 class Model(nn.Module):  def __init__(self, in_features, h1, h2, out_features=0):  super(Model, self).__init__()  self.fc1 = nn.Linear(in_features,h1) # input layer  self.fc2 = nn.Linear(h1, h2) # hidden layer  self.out = nn.Linear(h2, out_features) # output layer    def forward(self, x):  x = F.relu(self.fc1(x))  x = F.relu(self.fc2(x))  x = self.out(x)  return x  model = Model(in_features=59, h1=64, h2=32, out_features=1)  

Затем мы перейдем к обучению, где я выполню следующий код:

 epochs = 300  losses = []  for i in range(epochs):    y_pred = model(X_train)    loss = criterion(y_pred, y_train)  losses.append(loss.detach().numpy())    optimizer.zero_grad()  loss.backward()  optimizer.step()  

Все работает нормально, но с помощью метода модели forward() я y_pred получаю форму [1359, 1] (я думаю, так и должно быть [1359] , потому что моя y_train форма соответствует этой форме, и я получаю следующее предупреждение:

 C:Usershpanaconda3libsite-packagestorchnnmodulesloss.py:528: UserWarning: Using a target size (torch.Size([1359])) that is different to the input size (torch.Size([1359, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.  return F.mse_loss(input, target, reduction=self.reduction)  

Это также происходит, когда я пытаюсь оценить свою модель

 with torch.no_grad():    y_val = model(X_test)    loss = criterion(y_val.flatten(), y_test)    print(loss)  

Ответ №1:

Действительно, у вас есть несоответствие формы, ваша модель выведет тензор формы (batch_size, 1) , пока ваша цель имеет форму (batch_size,) . Вы должны явно транслировать свой тензор таким образом, чтобы входные данные вашего критерия имели форму.

Либо путем изменения самого прогноза y_val :

 gt;gt;gt; loss = criterion(y_val[:,0], y_test)  

Или целевой тензор y_test :

 gt;gt;gt; loss = criterion(y_val, y_test[:,None])  

Комментарии:

1. Спасибо за ваше решение. Но я хочу понять, является ли код u тем, что я обычно должен делать, или он может быть включен непосредственно на этапе предварительной обработки?

2. Я имею в виду, существует ли какой-либо «априорный» способ для того, чтобы модель выводила правильную форму?

3. A nn.Linear всегда будет выводить a n -мерный тензор, где n gt; 1 (в большинстве случаев n = 2 ). Однако ваш набор данных может выводить соответствующую целевую форму.