Rod*_*uiz 6 python keras tensorflow tensorflow2.0
我尝试实施precision并recall作为自定义指标,如https://datascience.stackexchange.com/questions/45165/how-to-get-accuracy-f1-precision-and-recall-for-a-keras-model/45166#45166 ?newreg=6190503b2be14e8aa2c0069d0a52749e,但由于某种原因,这些数字是关闭的(我确实知道批次问题的平均值,这不是我要说的)。
所以我尝试实施另一个指标:
def p1(y_true, y_pred):
return K.sum(y_true)
Run Code Online (Sandbox Code Playgroud)
只是为了看看会发生什么......我希望看到一个直线图,其中1包含我的数据集中的's数量(我正在研究一个有binary_crossentropy损失的二元分类问题)。
因为 Keras 将自定义指标计算为每批结果的平均值,如果我有一个大小为 32 的批处理,我希望这个p1指标返回 16,但我得到了 15。如果我使用一个大小为 16 的批处理,我得到接近 7.9 的东西。那是我尝试使用该fit方法的时候。
我还在训练模型后手动计算了验证精度,它确实给了我一个与我val_precision从历史上看到的最后一个不同的数字。那是使用fir_generator,在这种情况下batch_size没有提供,所以我假设它一次计算整个验证数据集的度量。
另一个重要的细节是,当我使用相同的数据集进行训练和验证时,即使我在最后一个时期获得相同的真阳性和预测阳性的数字,训练和验证精度也不同(1 和 0.6)。
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
Run Code Online (Sandbox Code Playgroud)
显然 32.0 / (32.0 + K.epsilon()) = 0.6000000238418579
知道出了什么问题吗?
可能有帮助的东西:
def p1(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
return 1.0 / (true_positives + K.epsilon())
def p2(y_true, y_pred):
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
return 1.0 / (predicted_positives + K.epsilon())
def p3(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
return true_positives
def p4(y_true, y_pred):
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
return predicted_positives
Run Code Online (Sandbox Code Playgroud)
老实说,我曾经遇到过同样的问题,对我来说,最好的解决方案是使用Recall内置Precision指标。
从 TensorFlow 2.0 开始,这两个指标是内置的tensorflow.keras.metrics,只要您在最后一层使用binary_crossentropya ,它们就可以很好地工作Dense(1)(当然,它们最终是二元分类的指标)。
主要的事情(值得注意的是)是实现与您尝试实现的以及之前 Keras 中的实现完全不同。
事实上,在 Keras 1.X 版本中,所有这些指标都可用(F1-Score、Recall 和 Precision),但从 Keras 2.X 开始,它们被删除,因为批量估计与全局估计无关。这些指标。
根据 Francois Chollet(2017 年 3 月 19 日)的说法(https://github.com/keras-team/keras/issues/5794):
基本上,这些都是按批次近似的全局指标,这更具误导性,而不是有帮助。文档中提到了这一点,但将它们完全删除会干净得多。一开始将它们合并就是一个错误。
然而,在 TensorFlow 2.0( tensorflow.keras.metrics) 中,它们使用专门的内置累加器,并且计算正确,因此与您的数据集相关。您可以在这里找到更详细的描述:
https://www.tensorflow.org/api_docs/python/tf/keras/metrics/Recall?version=stable
我强烈建议:使用内置指标,并跳过手动实现它们,特别是因为您自然会批量实现它们。
如果您在加载模型时遇到问题,请确保以下事项:
load_model如果问题仍然存在,请通过查阅以下代码片段确保传递自定义信息:
metric_config_dict = {
'precision': precision
}
model = tensorflow.keras.models.load_model('path_to_my_model.hdf5',custom_objects= metric_config_dict)
Run Code Online (Sandbox Code Playgroud)Francois Chollet 谈 Keras 2.3.0 的发布:
Keras 2.3.0 是第一个支持 TensorFlow 2.0 的多后端 Keras 版本。它保持与 TensorFlow 1.14、1.13 以及 Theano 和 CNTK 的兼容性。
从 TensorFlow 2.0 开始,此版本使 API 与 tf.keras API 保持同步。但请注意,它不支持大多数 TensorFlow 2.0 功能,特别是急切执行。如果您需要这些功能,请使用 tf.keras。
这也是多后端 Keras 的最后一个主要版本。展望未来,我们建议用户考虑将其 Keras 代码切换到 TensorFlow 2.0 中的 tf.keras。它实现了相同的 Keras 2.3.0 API(因此切换应该像更改 Keras import 语句一样简单),但它对于 TensorFlow 用户有许多优势,例如支持急切执行、分发、TPU 训练以及通常更好的集成低级 TensorFlow 和高级概念(如层和模型)之间的关系。保养起来也比较好。
未来的开发将集中在 tf.keras 上。我们将在接下来的 6 个月内继续维护多后端 Keras,但我们只会合并错误修复。API 更改不会被移植
因此,即使是 Keras 的创建者也建议我们改用tf.keras普通的keras. 另请切换您的代码并检查问题是否仍然存在。如果你混合使用tf.keras和keras,你会得到各种奇怪的错误;因此将所有导入更改为tf.keras. 有关 TensorFlow 2.0 的更多信息和更多更改,您可以查阅: https: //www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2 -0/