Keras自定义指标总和错误

2023-11-21

我尝试实施precision and 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)

只是为了看看会发生什么......我期望看到的是一个包含数量的直线图1我的数据集中有(我正在研究一个二进制分类问题binary_crossentropy loss).

因为 Keras 将自定义指标计算为每个批次结果的平均值,所以如果我有一个大小为 32 的批次,我会期望这样p1指标返回 16,但我得到的是 15。如果我使用一批大小为 16,我会得到接近 7.9 的值。那是我尝试使用fit method.

在训练模型后,我还手动计算了验证精度,它确实给出了与我最后看到的不同的数字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

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

从 TensorFlow 2.0 开始,这两个指标是内置的tensorflow.keras.metrics,并且只要您使用它们就可以很好地工作binary_crossentropy with a 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

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

如果您在加载模型时遇到问题,请确保满足以下条件:

  • 确保您已安装 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 是第一个支持多后端 Keras 的版本 TensorFlow 2.0。它保持与 TensorFlow 1.14、1.13、 以及 Theano 和 CNTK。

此版本使 API 与 tf.keras API 同步 TensorFlow 2.0。但请注意,它不支持大多数 TensorFlow 2.0 的特性,特别是 eager execution。如果您需要这些功能,请使用 tf.keras。

这也是多后端 Keras 的最后一个主要版本。去 今后,我们建议用户考虑切换他们的 Keras 代码 到 TensorFlow 2.0 中的 tf.keras。它实现了相同的 Keras 2.3.0 API (因此切换应该像更改 Keras 导入一样简单 语句),但它对于 TensorFlow 用户来说有很多优点,例如 支持 Eager Execution、分发、TPU 训练等 低级 TensorFlow 和高级 TensorFlow 之间更好的集成 图层和模型等概念。保养起来也比较好。

未来的开发将集中在 tf.keras 上。我们会保留 在接下来的 6 个月内维护多后端 Keras,但我们将 仅合并错误修复。 API 更改不会被移植

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras自定义指标总和错误 的相关文章

  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce

随机推荐