python - 带有 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
根据批号选择,但它不起作用。看来,当您编译模型时,损失函数内部的属性无法更改。任何建议都非常感谢。
解决方案
根据1中的讨论,Keras 似乎在计算每个批次的验证损失的同时计算了训练损失。但是,在训练过程中,日志中只会不断报告一个运行平均值以进行训练。因此,上面给出的代码片段正在按预期工作。它正在记录日志,因为正在为每个小批量计算验证损失。如果我需要在每个 epoch 中监控贝叶斯推理,我必须付出计算代价。
推荐阅读
- android - 由于 icon_tree_shaker,Flutter 无法在 Android 上构建
- php - PHP on 在数组中找到两个键等于两个值的数组并将其从数组中删除
- hibernate - 如何根据 Spring Data JPA 中另一个属性的值返回 Map?
- android - 如何从 Android 应用程序中的 node.js 服务器读取响应
- javascript - 如何使用 jest 模拟 MediaSource?
- react-native - 为 LocalizedStrings 设置初始语言 React 本地化
- django - 无法安装频道
- github - GitHub 页面上的侧边栏
- vue.js - 如何在 Vue PWA 中跳过等待服务人员
- ajax - 通过 Varnish/Nginx 发出 AJAX 请求时如何停止混合内容错误