我已经使用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
的权重集。我试图像2中那样由lovecambi实现该解决方案,使得根据批次号选择了n_MonteCarlo_Samples
,但是它不起作用。看起来,当您编译模型时,损失函数内部的属性无法更改。任何建议都非常感谢。
答案 0 :(得分:0)
根据1中的讨论,看来Keras与训练损失同时计算每批的验证损失。但是,在训练过程中,日志中只会不断记录运行平均值,以进行训练。因此,上面给出的代码段正在按预期的方式工作。正在记录日志,因为正在为每个小批量计算验证损失。如果需要在每个时期监视贝叶斯推理,则必须付出计算代价。