张量流 model.evaluate 和 model.predict 非常不同的结果

2024-01-09

我正在构建一个简单的 CNN 用于二值图像分类,并且从 model.evaluate() 获得的 AUC 远高于从 model.predict() + roc_auc_score() 获得的 AUC.

整个笔记本是here https://github.com/pro100olga/dlaicourse/blob/master/evaluate_predict.ipynb.

编译模型并输出 model.fit():

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(lr=0.001),
              metrics=['AUC'])

history = model.fit(
      train_generator,
      steps_per_epoch=8,  
      epochs=5,
      verbose=1)

纪元 1/5 8/8 [================================] - 21s 3s/步 - 损失:6.7315 - auc:0.5143

纪元 2/5 8/8 [================================] - 15s 2s/步 - 损失:0.6626 - auc:0.6983

纪元 3/5 8/8 [================================] - 18s 2s/步 - 损失:0.4296 - auc:0.8777

纪元 4/5 8/8 [================================] - 14s 2s/步 - 损失:0.2330 - auc:0.9606

纪元 5/5 8/8 [================================] - 18s 2s/步 - 损失:0.1985 - auc:0.9767

然后 model.evaluate() 给出类似的东西:

model.evaluate(train_generator)

9/9 [================================] - 10s 1s/步 - 损失:0.3056 - auc:0.9956

但直接从 model.predict() 方法计算出的 AUC 会低两倍:

from sklearn import metrics

x = model.predict(train_generator)
metrics.roc_auc_score(train_generator.labels, x)

0.5006148007590132


我读过几篇关于类似问题的帖子(比如this https://stackoverflow.com/questions/57212021/getting-different-results-from-keras-model-evaluate-and-model-predict, this https://stackoverflow.com/questions/44476706/what-is-the-difference-between-keras-model-evaluate-and-model-predict, this https://stackoverflow.com/questions/49903706/keras-predict-gives-different-error-than-evaluate-loss-different-from-metrics并且github上的广泛讨论 https://github.com/keras-team/keras/issues/6977),但他们描述的原因与我的情况无关:

  • 使用binary_crossentropy进行多类任务(不是我的情况)
  • 由于使用批量与整体而导致评估和预测之间的差异 数据集(不应像我的情况那样导致如此剧烈的下降)
  • 使用批量归一化和正则化(不是我的情况,也应该 不会造成这么大的下降)

非常感谢任何建议。谢谢!


编辑!解决方案我已经找到了解决方案here https://github.com/keras-team/keras/issues/3296,我只需要打电话

train_generator.reset()

在 model.predict 之前,并在 flow_from_directory() 函数中设置 shuffle = False 。差异的原因是生成器输出从不同位置开始的批次,因此标签和预测将不匹配,因为它们与不同的对象相关。所以问题不在于评估或预测方法,而在于生成器。


EDIT 2如果使用 flow_from_directory() 创建生成器,则使用 train_generator.reset() 并不方便,因为它需要在 flow_from_directory 中设置 shuffle = False,但这会在训练期间创建包含单个类的批次,从而影响学习。所以我最终在运行预测之前重新定义了 train_generator 。


tensorflow.kerasAUC 通过黎曼和计算近似 AUC(曲线下面积),这与 scikit-learn 的实现不同。

如果你想找到 AUCtensorflow.keras, try:

import tensorflow as tf

m = tf.keras.metrics.AUC()

m.update_state(train_generator.labels, x) # assuming both have shape (N,)

r = m.result().numpy()

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

张量流 model.evaluate 和 model.predict 非常不同的结果 的相关文章

随机推荐

  • Three.js 将一个对象添加到组中,但保持全局位置/旋转/缩放不变

    我想将一个对象从一个组 或世界 场景 移动到另一个组 但保持其全局转换不变 基本上 我不想看到对象发生变化 基本上是这样的 store current world transformation var origWorldMatrix myO
  • SQL 查询选择表中除两列之外的所有列

    我在 ms access 中有一个表 列名称为 A 到 H TableA A B C D E F G H 我如何编写一个查询来选择除 B 和 F 列之外的所有列 查询结果应该是 A C D E G H 我们有这样的东西吗 select fr
  • 连续从流中读取?

    我有一个 Stream 对象 偶尔会获取一些数据 但间隔时间不可预测 Stream 上出现的消息是明确定义的 并提前声明其有效负载的大小 大小是包含在每个消息的前两个字节中的 16 位整数 我想要一个 StreamWatcher 类来检测
  • Flask:如何读取应用程序根目录中的文件?

    我的 Flask 应用程序结构如下 application top application static english words txt templates main html urls py views py runserver py
  • 仅增加选定边缘的宽度 (cytoscape.js)

    当我选择几个相连的节点或简单的边时 如何预定义使所选边的宽度变大 而不影响整个网络的其余边或节点的宽度 我在选择节点或边时预定义了这一点 cy cytoscape style cytoscape stylesheet selector se
  • 正则表达式匹配第一个和最后一个单词或任何单词

    我有一个巨大的文件 其中包含如下数据列表 fabulous 7 526 2301 2 excellent 7 247 2612 3 superb 7 199 1660 2 perfection 7 099 3004 4 terrific 6
  • 将 Tweepy Status 对象转换为 JSON

    我在用着Tweepy http www tweepy org下载推文 我有一个程序 然后编写实际的Status对象以文本形式存在于文件中 如何将其转换为 JSON 或将此对象导入回 Python 我尝试过使用 JSON 库进行编码 但 St
  • 使用 XCB 获取键盘布局和按键符号

    我正在为 Linux 创建一个集成在简单窗口管理器中的屏幕键盘 我目前正在使用 XCB 现在我想制作假击键 使用 xtest 扩展一切工作正常 除了我无法从我想要放置的键符中获取真实键码的细节之外 目前我正在使用 xcb key symbo
  • Django中如何防止多次登录

    我正在编写一个无法同时登录的用户系统 如果账户在某处处于登录状态 而有人在其他位置登录同一个账户 后一个将登录 前一个将注销 我正在使用一个模型 其中 oneToOneField 与用户模型关联 并保存该用户的会话 ID 代码如下 from
  • Angular 4:表单提交事件完成后关闭模式

    我正在使用 bootstrap 4 modal 当我按下关闭按钮时 modal 会正确关闭 但我想在提交表单中的创建按钮后关闭模式 我正在使用角度4 div class modal fade div class modal dialog d
  • 如何在 AfterMethod 中 TestNG 中测试失败?

    我想在每次测试后检查一些外部日志文件 看看执行过程中是否存在错误 抛出异常AfterMethod不起作用 因为 TestNG 的处理方式不同 它只会使配置方法失败 而不是前面的测试失败 我的方法是这样的 AfterMethod always
  • Perl 脚本无法运行;仅在浏览器中显示实际代码

    我是 Perl 新手 无法让我的脚本正常运行 我应该将实际的 Perl 脚本放在哪里才能正确运行 我正在笔记本电脑上测试所有内容 并尝试从 html 页面调用脚本 而我得到的只是 Web 浏览器中显示的实际脚本 代码 本身 而不是代码设计产
  • SQL Server 中的递归好吗?

    我在 SQL Server 中有一个表 它具有 Item ID Item ParentID 的正常树结构 假设我想迭代并获取特定 Item ID 的所有子项 在任何级别 递归似乎是这个问题的直观候选者 我可以编写一个 SQL Server
  • 如何在一个 SSRS 页面上拥有多个表来表示 SQL 中的一个值?

    我开发了一份一页报告 其中有 4 个表格 我对这个结果很满意 这是针对一个地区显示的 district 002 数据集仅选择了一个地区 我想在数据集中选择多个地区 一个 SQL 字段 并有多个页面代表每页一个地区 所以 换一种方式来说 大约
  • authClient.login 返回错误“未经授权的请求来源”

    这在过去几天里才开始发生 我的代码没有改变 我犯了一个错误 还是这是新的 这似乎意味着我应该在 firebase forge 中的安全规则中添加一条规则 以允许从我正在处理的域 在本例中为 localhost 进行访问 但我不知道在哪里可以
  • 使用汇编器(NASM 32 位)输入和处理 IEEE 784 上的浮点数

    我正在大学学习计算机体系结构科目 我被分配编写一个工具 该工具将浮点数作为输入 我想将其存储在内存中并打印出 IEEE 784 标准中数字的二进制表示形式的十六进制形式 现在我确定了 IEEE 784 纸上将任何十进制浮点数转换为其二进制形
  • 获取点阵条形图函数中分组条形的中点值

    我试图弄清楚如何确定分组条形的中点值 即每个条形中心的实际 X 位置 这在基本 R 中很容易完成barplot功能 但是我希望能够做到这一点lattice s barchart 我的目标是在相应栏的顶部显示文本列的值 只要我不使用子组 下面
  • 在 Django 中启用 CORS(跨域请求)

    我正在尝试使用立交桥 APIhttp wiki openstreetmap org wiki Overpass API http wiki openstreetmap org wiki Overpass API在 Django 上运行的项目
  • 为什么R中order(order(x))等于rank(x)?

    In this post http www portfolioprobe com 2012 07 26 r inferno ism order is not rank 据称order order x 是相同的rank X 虽然一些实验证实了
  • 张量流 model.evaluate 和 model.predict 非常不同的结果

    我正在构建一个简单的 CNN 用于二值图像分类 并且从 model evaluate 获得的 AUC 远高于从 model predict roc auc score 获得的 AUC 整个笔记本是here https github com