使用加权类评估 Keras 中的 DenseNet 模型

问题描述

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

创建加权类:

# 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}%")

解决方法

找到了。

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

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

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

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