Функция периодических / осциллирующих потерь для Pytorch CCNN - PullRequest
0 голосов
/ 27 июня 2019

Я тренирую CNN в ImageNet и вижу некоторые странные периодические колебания в моей функции потерь. Кривая в целом выглядит правильно, но вы можете увидеть четкие колебания, когда кривая сглаживается. Я фиксирую потери каждые 100 мини-партий, и поскольку размер моей партии составляет 128, а мой тренировочный набор составляет ~ 100 тыс. Изображений, это означает, что для прохождения данных требуется 10 шагов. Таким образом, периодичность, которую я вижу здесь, заключается в том, что потеря увеличивается в течение 10 шагов, а затем внезапно падает в начале новой эпохи, а затем постепенно увеличивается, пока не будет достигнута следующая эпоха.

Я показываю большую часть своего тренировочного кода ниже (для краткости не показываю его полностью). Я сбрасываю «running_loss» в ноль в начале каждой эпохи и в конце каждого набора из 100 мини-пакетов. У кого-нибудь есть здесь какая-то перспектива? Я не знаю, делаю ли я что-то неправильно в том, как я вычисляю / собираю убытки, или в моей модели есть что-то более фундаментальное.

train_data = ImageDataset(train_file_list, transform=transform)        
train_data_loader = DataLoader(train_data, batch_size=128, shuffle=True, num_workers=4)

alexnet = AlexNetPyTorch(NUM_CLASSES)
alexnet = alexnet.to(device)
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(params=alexnet.parameters(), lr=3.0e-4, weight_decay=5.0e-4)

history = {}
history['loss'] = []
history['val_loss'] = []
history['accuracy'] = []
history['val_accuracy'] = []
step_increment = 100
for epoch in range(30):

    running_loss = 0.0
    running_val_loss = 0.0

    for step, data in enumerate(train_data_loader):
        alexnet.train()
        X_train, y_train = data
        X_train = X_train.to(device)
        y_train = y_train.to(device)

        # forward + backward + optimize
        y_pred = alexnet(X_train)
        loss = loss_fn(y_pred, y_train)

        # zero the parameter gradients
        optimizer.zero_grad()

        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()

        if step % step_increment == step_increment-1:    # print every 100 mini-batches

            # Compute validation loss
            with torch.no_grad():
                alexnet.eval()

                _, preds = torch.max(y_pred,1)
                train_accuracy = torch.sum(preds == y_train).item()/len(y_train)

                X_val, y_val = validation_data
                X_val = X_val.to(device)
                y_val = y_val.to(device)
                y_pred = alexnet(X_val)
                val_loss = loss_fn(y_pred, y_val).item()

                _, preds = torch.max(y_pred,1)
                val_accuracy = torch.sum(preds == y_val).item()/len(y_val)

                history['loss'].append(np.mean(running_loss/step_increment))
                history['accuracy'].append(train_accuracy)
                history['val_accuracy'].append(val_accuracy)
                history['val_loss'].append(val_loss)

                print('[%d, %5d] loss: %.3f acc: %.3f val loss: %.3f val acc: %.3f' %
                      (epoch + 1, step+1, running_loss/step_increment, train_accuracy, val_loss, val_accuracy))

                running_loss = 0.0

Loss Function

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