【发布时间】:2021-06-14 00:18:36
【问题描述】:
我正在训练的 tf.keras.Model 具有以下主要性能指标:
- 逃逸率:(#samples with predict label 0 AND true label 1) / (#samples with true label 1)
- 错误调用率:(#samples with predict label 1 AND true label 0) / (#samples with true label 0)
目标逃逸率是预定义的,这意味着必须适当设置决策阈值。为了计算由此产生的误报率,我想在下面的伪代码行的某处实现一个自定义指标:
# separate predicted probabilities by their true label
all_ok_probabilities = all_probabilities.filter(true_label == 0)
all_nok_probabilities = all_probabilities.filter(true_label == 1)
# sort NOK samples
sorted_nok_probabilities = all_nok_probabilities.sort(ascending)
# determine decision threshold
threshold_idx = round(target_escape_rate * num_samples) - 1
threshold = sorted_nok_probabilities[threshold_idx]
# calculate false call rate
false_calls = count(all_ok_probabilities > threshold)
false_call_rate = false_calls / num_ok_samples
我的问题是,在 MirroredStrategy 环境中,tf.keras 自动将度量计算分布到所有副本中,每个副本在每次更新时获取 (batch_size / n_replicas) 个样本,最后对结果求和。然而,我的算法只有在所有标签和预测结合时才能正常工作(最终的求和可能通过除以副本数来克服)。
我的想法是将我度量标准的update_state() 方法中的所有y_true 和y_pred 连接成序列,并在result() 中运行评估。然而,第一步似乎已经不可能了; tf.Variable 只为数字标量提供合适的聚合方法,而不是为序列: tf.VariableAggregation.ONLY_FIRST_REPLICA 让我失去从第 2 个副本到第 n 个副本的所有数据,SUM 默默地锁定了 fit() 调用,MEAN 在我的情况下没有任何意义应用程序(也可能挂起)。
我已经尝试在 MirroredStrategy 范围之外实例化指标,但 tf.keras.Model.compile() 不接受。
任何提示/想法?
P.S.:如果您需要一个最小的代码示例,请告诉我,我正在努力。 :)
【问题讨论】:
标签: python tensorflow keras