我试过在Keras被删除之前使用它们提供的代码。代码如下:
def precision(y_true, y_pred):
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)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
def recall(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = true_positives / (possible_positives + K.epsilon())
return recall
def fbeta_score(y_true, y_pred, beta=1):
if beta < 0:
raise ValueError('The lowest choosable beta is zero (only precision).')
# If there are no true positives, fix the F score at 0 like sklearn.
if K.sum(K.round(K.clip(y_true, 0, 1))) == 0:
return 0
p = precision(y_true, y_pred)
r = recall(y_true, y_pred)
bb = beta ** 2
fbeta_score = (1 + bb) * (p * r) / (bb * p + r + K.epsilon())
return fbeta_score
def fmeasure(y_true, y_pred):
return fbeta_score(y_true, y_pred, beta=1)
从我所看到的情况来看,他们似乎使用了正确的公式。但是,当我尝试在训练过程中将其用作度量时,我得到的瓦尔_accuracy、val_precision、val_recall和val_fmeasure的输出完全相等。我确实相信即使公式正确也可能发生这种情况,但我认为不太可能。对此问题有什么解释吗?
6条答案
按热度按时间myzjeezk1#
因为Keras 2.0去掉了f1、precision和recall指标。解决方案是使用一个自定义指标函数:
此函数的返回行
通过添加常数epsilon进行修改,以避免除以0。因此,将不计算NaN。
gopyfrb32#
使用Keras度量函数不是计算F1或AUC或类似值的正确方法。
其原因是在验证的每个批步骤都调用了指标函数。这样Keras系统计算批结果的平均值。这不是正确的F1分数。
这就是为什么F1得分被从度量函数中删除的原因。
正确的方法是使用自定义回调函数,如下所示:
o4tp2gmn3#
这是我使用子类化创建的流媒体自定义f1_score指标。它适用于TensorFlow 2.0测试版,但我还没有在其他版本上试用过。它的作用是跟踪真阳性、预测阳性、以及在整个时期内所有可能的阳性,然后在时期结束时计算F1分数。我认为其他答案只给出了每个批次的f1得分,当我们真正想要所有数据的f1得分时,这并不是最佳指标。
我得到了Aurélien Geron新书《使用Scikit-Learn & Tensorflow 2.0进行机器学习》的原始未经编辑副本,强烈推荐它。这就是我如何学习如何使用子类自定义f1指标的方法。这无疑是我见过的最全面的TensorFlow书籍。TensorFlow是一本非常痛苦的书,这家伙奠定了编码基础,学习了很多东西。
FYI:在Metrics中,我必须在f1_score()中放入括号,否则它将无法工作。
管道安装tensorflow 量==2.0.0-beta1
ldioqlga4#
正如@Diesche提到的,以这种方式实现f1_score的主要问题是,它在每个批处理步骤都被调用,导致的结果比其他任何事情都更混乱。
我已经为这个问题纠结了一段时间,但最终通过使用回调函数解决了这个问题:在一个时期结束时,回调函数使用新的模型参数对数据进行预测(在本例中,我选择只将其应用于我的验证数据),并为您提供在整个时期评估的一致度量。
我在python3上使用的是tensorflow GPU(1.14.0)
函数
from_proba_to_output
如下所示:然后,我在fit_generator的回调部分引用这个metrics类来训练我的模型,我没有详细介绍train_generator和valid_generator的实现,因为这些数据生成器特定于当前的分类问题,发布它们只会带来混乱。
zlhcx6iw5#
正如@Pedia在上面的评论中所说的那样,
on_epoch_end
,正如github.com/fchollet/keras/issues/5400中所说的那样,是最好的方法。cwxwcias6#
我还建议使用此变通方法
model.fit(nb_epoch=1, ...)
,利用每个历元后输出的精度/召回率指标大概是这样的