我已经使用Keras (1)实现了贝叶斯SegNet。为此,我使用了以下自定义损失函数,该函数对验证损失执行贝叶斯推断:
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中一样,这样就可以根据批号选择lovecambi,但它不起作用。似乎在编译模型时,损失函数中的属性不能更改。任何建议都是非常感谢的。
发布于 2019-09-21 03:25:03
根据1中的讨论,Keras似乎在计算训练损失的同时计算每批的验证损失。然而,在训练过程中,只有运行平均值不断地报告在训练日志中。因此,上面给出的代码片段正在做它应该做的工作。它正在记录日志,因为正在计算每个小批次的验证损失。如果我需要在每个时期监控贝叶斯推理,我必须付出计算代价。
https://stackoverflow.com/questions/58001987
复制相似问题