Почему моя CNN дает результат потери как нано при использовании функции потери MSE - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть CNN, который я использую для определения ключевой точки лица.Я могу построить точки истинности земли и также спрогнозировать, какие ключевые точки будут показаны.Однако они сгруппированы вокруг центра изображения и не двигаются во время или после тренировки.

Я использовал nll_loss с оптимизатором SGD.При этом я получил ожидаемые значения потерь, например, 0,00364755.Я читал, что MSE был хорошим выбором для проблем регрессии, и я изменил функцию потерь на MSE, и теперь все, что я получаю, когда тренировка - это моя потеря.Я изменил params методично, например, пример lr с 0.1 - 0.0000001, импульс 0.1 - 0.9, размеры партий 1, 16, 32, 64, 128

Вот часть кода.Как всегда, любая помощь приветствуется, спасибо за внимание.

    criterion = nn.MSELoss()

def train(args, model, device, train_loader, criterion, optimizer, 
epoch):
    running_loss = 0.0
    total_train_loss = 0.0
    model.train()
    for batch_idx, batch in enumerate(train_loader):
        data = batch['image']
        target = batch['key_points']
        target = target.view(target.size(0), -1)
        data, target = data.to(device), target.to(device)
        target = target.type(torch.cuda.FloatTensor)
        data = data.type(torch.cuda.FloatTensor)
        data = data.unsqueeze(1).float()
        output = model(data)  # forward pass
        target = target.view(target.shape[0], -1)
        # print(target.dtype, ' Target Data Type')
        # print(data.dtype, ' Data Data Type')
        train_loss = criterion(output, target)
        optimizer.zero_grad()
        train_loss.backward()
        optimizer.step()

        # print loss 
        running_loss += train_loss.item()
        if batch_idx % 10 == 9:  # print every 10 batches
            print('Epoch: {}, Batch: {}, Avg. Loss: 
 {}'.format(epoch + 1, batch_idx + 1, running_loss / 1000))
        # running_loss = 0.0

  print('Finished Training')


def test(args, model, device, criterion, val_loader):
    model.eval()
    total_loss = 0
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for batch_idx, batch in enumerate(val_loader):
            data = batch['image']
            target = batch['key_points']
            data, target = data.to(device), target.to(device)
            target = target.type(torch.cuda.FloatTensor)
            data = data.type(torch.cuda.FloatTensor)
            output = model(data)

            test_loss = criterion(output, target)
            # print('TESTING 4: Data and target shape: ', 
data.shape, ' ', target.shape)

            total_loss += test_loss

                test_loss /= len(val_loader.dataset)

                print('\nTest set: Average loss: {:.4f}, Accuracy: 
    {}/{} 
    ({:.0f}%)\n'.format(
                    test_loss, correct, len(val_loader.dataset),
                    100. * correct / len(val_loader.dataset)))
        return total_loss / batch_idx
    enter code here
...