【问题标题】:Evaluating DenseNet model in Keras with weighted classes使用加权类评估 Keras 中的 DenseNet 模型
【发布时间】:2021-08-29 21:29:47
【问题描述】:

我正在使用 DenseNet 在 Keras 中进行二进制分类。

创建的加权类:

# Assign weights
weight_for_0 = num_normal/(num_normal + num_covid)
weight_for_1 = num_covid/(num_normal + num_covid)
class_weight = {0: weight_for_0, 1: weight_for_1}

# Print
print(f"Weight for class 0: {weight_for_0:.2f}")
print(f"Weight for class 1: {weight_for_1:.2f}")

结果,我有

Weight for class 0: 0.74
Weight for class 1: 0.26

我为模型拟合了class_weight

history_dense201_weighted = model_dense_201.fit_generator(train_generator, epochs = 20, 
validation_data = valid_generator, class_weight = class_weight, callbacks = [# mcp_save,                                                                                                                                                            
early_stopping, tensorboard_callback])

但是当我想评估模型时,我不确定如何评估加权模型,因为class_weight 是历史的一部分。

如何更新此代码,使用加权模型而不是默认的model_dense_201 模型?

# Evaluation 
evaluation = model_dense_201.evaluate(valid_generator)
print(f"Validation Accuracy: {evaluation[1] * 100:.2f}%")
evaluation = model_dense_201.evaluate(train_generator)
print(f"Train Accuracy: {evaluation[1] * 100:.2f}%")

【问题讨论】:

  • 我不知道你为什么把它弄得这么复杂,model.evaluate 还需要一个样本权重参数,你可以从中实现类权重。
  • 谢谢,有什么例子吗?试图找到并且不知道如何正确地做到这一点。

标签: python keras transfer-learning weighted densenet


【解决方案1】:

找到这个。

https://github.com/tensorflow/tensorflow/issues/35825

来自弗朗索瓦(又名 Chollet)的引述:

“我们在评估中不支持类权重的原因是 class_weight 参数表示从标签计算的样本权重,但在评估期间标签不应作为模型的输入。在训练期间这很好,但在评估期间,这表示数据从标签泄漏到您的指标。如果您在评估中使用类加权,您的分数将无法在真实测试数据上重现(当您没有标签时)。

所以这在概念上是错误的。”

【讨论】:

  • 当加权的原因是为了处理不平衡的训练数据时,这可能没问题。我有一个应用程序,其中获得某个类比其他类更重要,我希望看到我在评估中的权重因子。从类权重创建样本权重只是额外的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2019-03-20
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多