gpt4 book ai didi

python - Keras自定义指标总和错误

转载 作者:行者123 更新时间:2023-12-01 03:03:12 25 4
gpt4 key购买 nike

我尝试实现 precisionrecall作为自定义指标,如 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)

只是为了看看会发生什么......我期望看到一个带有 1 号的直线图。我的数据集中有(我正在研究 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)))

显然 32.0 / (32.0 + K.epsilon()) = 0.6000000238418579
知道出了什么问题吗?

可能有帮助的东西:

enter image description here
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

最佳答案

老实说,我曾经遇到过同样的问题,对我来说,最好的解决方案是使用 RecallPrecision来自内置指标。

从 TensorFlow 2.0 开始,这两个指标是内置的 tensorflow.keras.metrics ,只要您使用 binary_crossentropy,它们就可以正常工作与 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):

Basically these are all global metrics that were approximated batch-wise, which is more misleading than helpful. This was mentioned in the docs but it's much cleaner to remove them altogether. It was a mistake to merge them in the first place.



但是,在 TensorFlow 2.0( tensorflow.keras.metrics ) 中,它们使用专门的内置累加器,并且计算正确,因此与您的数据集相关。您可以在此处找到更详细的说明:

https://www.tensorflow.org/api_docs/python/tf/keras/metrics/Recall?version=stable

我强烈建议:使用内置指标,并跳过手动实现它们,特别是因为您自然会批量实现它们。

如果您在加载模型时遇到问题,请确保以下几点:
  • 确保您已安装 Python 3(>=3.6.X)
  • 如果问题仍然存在,请确保将自定义信息传递给 load_model通过查阅以下代码段:
      metric_config_dict = {
    'precision': precision
    }

    model = tensorflow.keras.models.load_model('path_to_my_model.hdf5',custom_objects= metric_config_dict)

  • Francois Chollet 关于 Keras 2.3.0 的发布:

    Keras 2.3.0 is the first release of multi-backend Keras that supports TensorFlow 2.0. It maintains compatibility with TensorFlow 1.14, 1.13, as well as Theano and CNTK.

    This release brings the API in sync with the tf.keras API as of TensorFlow 2.0. However note that it does not support most TensorFlow 2.0 features, in particular eager execution. If you need these features, use tf.keras.

    This is also the last major release of multi-backend Keras. Going forward, we recommend that users consider switching their Keras code to tf.keras in TensorFlow 2.0. It implements the same Keras 2.3.0 API (so switching should be as easy as changing the Keras import statements), but it has many advantages for TensorFlow users, such as support for eager execution, distribution, TPU training, and generally far better integration between low-level TensorFlow and high-level concepts like Layer and Model. It is also better maintained.

    Development will focus on tf.keras going forward. We will keep maintaining multi-backend Keras over the next 6 months, but we will only be merging bug fixes. API changes will not be ported



    因此,即使是Keras的创建者也建议我们切换到 tf.keras而不是普通 keras .还请切换您的代码并检查问题是否仍然存在。如果混用 tf.keraskeras ,你会得到各种奇怪的错误;因此将所有导入更改为 tf.keras .有关 TensorFlow 2.0 和更多更改的更多信息,您可以引用: https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/

    关于python - Keras自定义指标总和错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59724821/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com