Pytorch Crossentropy error в простом примере NN - PullRequest
0 голосов
/ 01 декабря 2018

H1, я пытаюсь сделать модель NN, которая удовлетворяет простой формуле.
y = X1 ^ 2 + X2 ^ 2

Но когда я использую CrossEntropyLoss для функции потерь, я получаю двадругое сообщение об ошибке.
Во-первых, когда я устанавливаю такой код

x = torch.randn(batch_size, 2)
y_hat = model(x)
y = answer(x).long()

optimizer.zero_grad()
loss = loss_func(y_hat, y)
loss.backward()
optimizer.step()

, я получаю это сообщение

RuntimeError: Assertion `cur_target >= 0 && cur_target < n_classes' failed.  at 
c:\programdata\miniconda3\conda-bld\pytorch_1533090623466\work\aten\src\thnn\generic/Cl 

assNLLCriterion.c: 93

Во-вторых, яизмените код следующим образом

x = torch.randn(batch_size, 2)
y_hat = model(x)
y = answer(x).long().view(batch_size,1,1)

optimizer.zero_grad()
loss = loss_func(y_hat, y)
loss.backward()
optimizer.step()

тогда я получу сообщение типа

RuntimeError: multi-target not supported at c:\programdata\miniconda3\conda-bld\pytorch_1533090623466\work\aten\src\thnn\generic/ClassNLLCriterion.c:21

Как я могу решить эту проблему?Спасибо. (Извините за мой английский)
Это мой код

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

def answer(x):

    y = x[:,0].pow(2) + x[:,1].pow(2)

    return y

class Model(nn.Module):

    def __init__(self, input_size, output_size):
        super(Model, self).__init__()

        self.linear1 = nn.Linear(input_size, 10)
        self.linear2 = nn.Linear(10, 1)

    def forward(self, x):

        y = F.relu(self.linear1(x))
        y = F.relu(self.linear2(y))

        return y

model = Model(2,1)
print(model, '\n')

loss_func = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr = 0.001)

batch_size = 3
epoch_n = 100
iter_n = 100

for epoch in range(epoch_n):
    loss_avg = 0

    for i in range(iter_n):

        x = torch.randn(batch_size, 2)
        y_hat = model(x)
        y = answer(x).long().view(batch_size,1,1)

        optimizer.zero_grad()
        loss = loss_func(y_hat, y)
        loss.backward()
        optimizer.step()

        loss_avg += loss

    loss_avg = loss_avg / iter_n

    if epoch % 10 == 0:
        print(loss_avg)

    if loss_avg < 0.001:
        break

Могу ли я создать набор данных, используя загрузчик данных в pytorch?Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 01 декабря 2018

Вы используете неправильную функцию потерь.CrossEntropyLoss используется для задач классификации, в целом, где ваша проблема заключается в регрессии.Таким образом, вы должны использовать потери, которые предназначены для регрессии, например, такие задачи, как Среднее квадратическое количество ошибок , L1 Потеря и т. Д. Посмотрите на это , это, это и это .

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