贝叶斯推断与辍学,验证集

时间:2019-09-18 23:45:48

标签: python validation keras

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

1 个答案:

答案 0 :(得分:0)

根据1中的讨论,看来Keras与训练损失同时计算每批的验证损失。但是,在训练过程中,日志中只会不断记录运行平均值,以进行训练。因此,上面给出的代码段正在按预期的方式工作。正在记录日志,因为正在为每个小批量计算验证损失。如果需要在每个时期监视贝叶斯推理,则必须付出计算代价。