Модель переподготовки начинается с более высоких потерь, чем она завершилась в последнем сеансе

#python #machine-learning #deep-learning #pytorch

#python #машинное обучение #глубокое обучение #pytorch

Вопрос:

Я обучаю модель для задачи шумоподавления.

Каждый раз, когда я ее тренирую, первая потеря в новой тренировочной сессии намного выше, чем потеря, с которой я закончил предыдущую. например, после первого обучения:

введите описание изображения здесь

Затем, когда я захотел обучить ее еще на 100 эпох:

введите описание изображения здесь

20x более высокие потери.

Почему это происходит?

Редактировать: Вот график потерь. Вы можете ясно видеть, что после эпохи 2500 наблюдается значительное увеличение потерь:

введите описание изображения здесь

Добавлен цикл обучения здесь:

 num_epochs = 500

criterion = torch.nn.MSELoss()

sgd_params = {
    "lr": 0.30,
    "momentum": 0.9
}

lin_optimizer = torch.optim.SGD(lin_model.parameters(), lr=0.30, momentum=0.9)
sta_optimizer = torch.optim.SGD(sta_model.parameters(), lr=0.30, momentum=0.9)
ref_optimizer = torch.optim.SGD(ref_model.parameters(), lr=0.30, momentum=0.9)

_, val_clean, val_noisy = util.lincomb_generate_data(batch_size*10, B, K, functions, sample_offset=sample_offset, noise_type="gaussian", noise_mean=noise_mean, noise_std=noise_std)

print("STARTED TRAINING")

for epoch in range(num_epochs):
    print("Current epoch {}r".format(epoch), end="")
    # generate data returns the x-axis used for plotting as well as the clean and noisy data
    _, t_clean, t_noisy = util.lincomb_generate_data(batch_size, B, K, functions, sample_offset=sample_offset, noise_type="gaussian", noise_mean=noise_mean, noise_std=noise_std)

    # ===================forward=====================
    lin_output = lin_model(t_noisy.float())
    sta_output = sta_model(t_noisy.float())
    ref_output = ref_model(t_noisy.float())

    lin_loss = criterion(lin_output.float(), t_clean.float())
    sta_loss = criterion(sta_output.float(), t_clean.float())
    ref_loss = criterion(ref_output.float(), t_clean.float())
    
    lin_loss_list.append(lin_loss.data)
    sta_loss_list.append(sta_loss.data)
    ref_loss_list.append(ref_loss.data)
    # ===================backward====================
    lin_optimizer.zero_grad()
    sta_optimizer.zero_grad()
    ref_optimizer.zero_grad()

    lin_loss.backward()
    sta_loss.backward()
    ref_loss.backward()

    lin_optimizer.step()
    sta_optimizer.step()
    ref_optimizer.step()
    
    val_lin_loss = F.mse_loss(lin_model(val_noisy.float()), val_clean.float())
    val_sta_loss = F.mse_loss(sta_model(val_noisy.float()), val_clean.float())
    val_ref_loss = F.mse_loss(ref_model(val_noisy.float()), val_clean.float())

print("DONE TRAINING")
  

правка 2: удар

Комментарии:

1. Не могли бы вы показать свой код для сохранения / загрузки вашей модели и / или код, который вы используете для обучения / переобучения модели? Существует ряд факторов, которые могут вызывать эту проблему. Сложно строить предположения, не видя, как вы реализовали свое обучение / переподготовку и сохранение / загрузку модели

2. Используете ли вы какие-либо планировщики скорости обучения (т. Е. ReduceLROnPlateau )? Похоже, что вы начинаете с высокой скорости обучения, которая расходится, а затем скорость обучения регулируется, и потери сходятся.

3. @BobsBurgers Я использую jupyter notebook, поэтому на самом деле я не сохраняю и не загружаю, а просто перезапускаю тот же блок с другим количеством эпох.

4. @DominikFicek Я не использовал никаких планировщиков LR