Функция потерь, используемая для отображения многомерных объектов - PullRequest
0 голосов
/ 02 декабря 2018

Я работаю над проектом видео анимации с использованием PyTorch.Мой набор данных содержит аудиофункции 3904x60 mfcc (вход) и соответствующие функции видео 3904x3 (выход).Цель состоит в том, чтобы обучить модель нейронной сети так, чтобы с учетом неизвестной функции звука модель отображала ее в соответствующую функцию видео.Другими словами, нейронная сеть выполняет сопоставление признаков от 60 до 3.Я уже построил нейронную сеть, следуя этому уроку :

class ConvNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer1 = nn.Sequential(
            nn.Conv1d(1, 32, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2, stride=2))
        self.layer2 = nn.Sequential(
            nn.Conv1d(32, 64, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2, stride=2))
        self.drop_out = nn.Dropout()
        self.fc1 = nn.Linear(15 * 64, 1000)
        self.fc2 = nn.Linear(1000, 3)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.reshape(out.size(0), -1)
        out = self.drop_out(out)
        out = self.fc1(out)
        out = self.fc2(out)
        return out

, и мой тренировочный код выглядит так:

model = ConvNet()

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)


for epoch in range(num_epochs):
    for i, (a, v) in enumerate(train_loader):
        # Run the forward pass
        a = a.float()
        v = v.long()
        outputs = model(a.view(a.size(0),1,a.size(1)))
        loss = criterion(outputs, v)
        loss_list.append(loss.item())

        # Backprop and perform Adam optimisation
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # Track the accuracy
        total = labels.size(0)
        _, predicted = torch.max(outputs.data, 1)
        correct = (predicted == labels).sum().item()
        acc_list.append(correct / total)

        if (i + 1) % 100 == 0:
            print('Epoch[{}/{}],Step[{}/{}],Loss{:.4f},Accuracy{:.2f}%'
              .format(epoch + 1, num_epochs, i + 1, total_step, loss.item(),
                      (correct / total) * 100))

, но получил ошибку при обучении:

---> 15 потерь = критерий (выходы, v)

многоцелевая не поддерживается в / Users / soumith / miniconda2 / conda-bld / pytorch_1532623076075 / work / aten /src / THNN / generic / ClassNLLCriterion.c: 21

Я определил размер пакета равным 4, поэтому каждое a и v в итерации должно быть тензором 4 на 60 и тензором 4 на 3,соответственно.Как мне решить эту проблему?

1 Ответ

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

Возможно, проблема связана с определением целевой функции, которую вы используете для nn.CrossEntropyLoss().v - это, как вы говорите, тензор 4 x 3, который выглядит неправильно.

В loss = criterion(outputs, v) функция потерь предполагает, что v будет тензор размера минибат с каждым значением, изображенным на одном из классов C (т. е. от 0 до C-1).См. Вкладку «Форма» в https://pytorch.org/docs/stable/nn.html?highlight=crossentropyloss#torch.nn.CrossEntropyLoss

Цель: (N), где каждое значение равно 0≤ целей [i] ≤C − 1

...