Ожидаемый размер цели (50, 88), есть факел. Размер ([50, 288, 88]) - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь тренировать свою нейронную сеть.Поезд в модели правильный, но я не могу рассчитать потери.Выход и цель имеют одинаковое измерение.

Я пытался использовать torch.stack, но не могу, потому что размер каждого входа равен (252, x), где x одинаково в252 элемента, но отличается для других входных данных.

Я использую пользовательский набор данных:

class MusicDataSet(Dataset):
def __init__(self, transform=None):
    self.ms, self.target, self.tam = sd.cargarDatos()  
    self.mean, self.std = self.NormalizationValues()                    
def __len__(self):
    return self.tam

def __getitem__(self, idx):
    #Normalize
    inp = (self.ms[idx]-self.mean)/self.std
    inp = torch.from_numpy(inp).float()    
    inp = inp.t()
    inp = inp.to('cuda')

    target= torch.from_numpy(self.target[idx])
    target = target.long()
    target = target.t()
    target = target.to('cuda')

    return inp, target

Я должен сказать, что список не может быть составлен с чем-то вроде: target = torch.Tensor () или torch.stack (), потому что это (252, х), как я уже сказал.

def music_collate_fn(batch):
    data = [item[0] for item in batch]
    data = pad_sequence(data, batch_first=True)
    target = [item[0] for item in batch]
    target = pad_sequence(target, batch_first=True)
    return data, target


musicSet = mds.MusicDataSet()
train_loader = torch.utils.data.DataLoader(musicSet,batch_size=50, collate_fn = music_collate_fn, shuffle=False)

input_dim = 252
hidden_dim = (512,1024,512)
output_dim = 88
mlp = rn.MLP(input_dim, hidden_dim, output_dim).to(device)

optimizer = torch.optim.RMSprop(mlp.parameters(), lr = learning_rate)
criterion = nn.CrossEntropyLoss()
for batch_idx, (x,y) in enumerate(train_loader):
    outputs = mlp(x.to(device))
    loss = criterion(outputs, y)
    optimizer.zero_grad()           
    loss.backward()                 
    optimizer.step()

Размер выходных данных и цели одинаковы,

output: torch.Size([50, 288, 88])
target:  torch.Size([50, 288, 88])

Но следующая ошибка появляется, когда я пытаюсь рассчитать потери:

  File "<ipython-input-205-3c47d7aa11a4>", line 32, in <module>
    loss = criterion(outputs, y)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\nn\modules\module.py", line 489, in __call__
    result = self.forward(*input, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\nn\modules\loss.py", line 904, in forward
    ignore_index=self.ignore_index, reduction=self.reduction)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\nn\functional.py", line 1970, in cross_entropy
    return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)

  File "C:\ProgramData\Anaconda3\lib\site-packages\torch
\nn\functional.py", line 1800, in nll_loss
    out_size, target.size()))

ValueError: Expected target size (50, 88), got torch.Size([50, 288, 88])

1 Ответ

1 голос
/ 22 мая 2019

Я думаю, что вы используете CrossEntropyLoss неправильно. Смотри документацию здесь .

В частности, если вход имеет форму [NxCxd], тогда target должен иметь форму [Nxd], а значение в target является целым числом от 0 до C-1, т.е. вы можете просто предоставить метки класса, и это не требуется. для горячего кодирования целевой переменной. Сообщение об ошибке также утверждает, что то же самое.

...