Байесовский вывод с выбыванием, набором валидации - PullRequest
0 голосов
/ 19 сентября 2019

Я реализовал байесовскую сеть SegNet с использованием Keras ( 1 ).Для этого я использовал следующую пользовательскую функцию потерь, которая выполняет байесовский вывод для потери проверки:

def custom_loss_Bayesian(y_true, y_pred):

    train_loss = K.categorical_crossentropy(y_true, y_pred)                    

    output_list = []
    for i in range(n_MoteCarlo_Samples):                                       
        output_list.append(K.categorical_crossentropy(y_true, y_pred))

    Monty_sample_bin = K.stack(output_list,axis=0)  
    val_loss_Bayesian=K.mean(Monty_sample_bin,axis=0)

    return K.in_train_phase(train_loss, val_loss_Bayesian)

Работает нормально, но у этого подхода есть большая проблема.Увеличивая количество образцов Монте-Карло, процесс обучения занимает намного больше времени.Вероятно, это связано с тем, что цикл проверки потерь вычисляется для каждой обучающей партии, но он нигде не используется.Мне нужно val_loss_Bayesian только после окончания каждой эпохи.Есть ли более умный способ сделать это?Обратите внимание, что я хочу использовать ModelCheckpoint, чтобы сохранить набор весов с самым низким val_loss_Bayesian.Я попытался реализовать решение с помощью lovecambi, как в 2 , так что n_MonteCarlo_Samples было выбрано на основе номера партии, но это не сработало.Похоже, что при компиляции модели свойства внутри функции потерь не могут быть изменены.Любые предложения приветствуются.

1 Ответ

0 голосов
/ 20 сентября 2019

Исходя из обсуждения в 1 , кажется, что Keras рассчитывает потери проверки для каждой партии одновременно с потерей обучения.Однако в процессе обучения в журнале постоянно отображается только скользящее среднее.Таким образом, приведенный выше фрагмент кода выполняет свою работу так, как должен.Он принимает журнал, потому что для каждой мини-партии вычисляется потеря проверки.Если мне нужен байесовский вывод, отслеживаемый в каждую эпоху, я должен заплатить вычислительную цену.

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