首页 > 解决方案 > 带有 dropout 和验证集的贝叶斯推理

问题描述

我已经使用 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所示,n_MonteCarlo_Samples根据批号选择,但它不起作用。看来,当您编译模型时,损失函数内部的属性无法更改。任何建议都非常感谢。

标签: pythonvalidationkeras

解决方案


根据1中的讨论,Keras 似乎在计算每个批次的验证损失的同时计算了训练损失。但是,在训练过程中,日志中只会不断报告一个运行平均值以进行训练。因此,上面给出的代码片段正在按预期工作。它正在记录日志,因为正在为每个小批量计算验证损失。如果我需要在每个 epoch 中监控贝叶斯推理,我必须付出计算代价。


推荐阅读