Я реализовал байесовскую сеть 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
было выбрано на основе номера партии, но это не сработало.Похоже, что при компиляции модели свойства внутри функции потерь не могут быть изменены.Любые предложения приветствуются.