#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
всегда будет выводить an
-мерный тензор, гдеn gt; 1
(в большинстве случаевn = 2
). Однако ваш набор данных может выводить соответствующую целевую форму.