我认为在这种情况下最好的选择是将 AUC 定义为一个新指标。为此,您必须在张量流中定义度量(我假设您正在使用张量流后端)。
我以前尝试过的一种方法(但是,我不记得我测试过它的结果的正确性)是这样的:
def as_keras_metric(method):
"""
This is taken from:
https://stackoverflow.com/questions/45947351/how-to-use-tensorflow-metrics-in-keras/50527423#50527423
"""
@functools.wraps(method)
def wrapper(*args, **kwargs):
""" Wrapper for turning tensorflow metrics into keras metrics """
value, update_op = method(*args, **kwargs)
tf.keras.backend.get_session().run(tf.local_variables_initializer())
with tf.control_dependencies([update_op]):
value = tf.identity(value)
return value
return wrapper
然后在编译模型时定义指标:
model.compile(metrics=['accuracy', as_keras_metric(tf.metrics.auc)], optimizer='adam', loss='categorical_crossentropy')
虽然这给出了数字,但我还没有确定它们是否正确。如果您能够对此进行测试,并且给出正确的结果,或者不正确,请告诉我,我有兴趣找出答案。
解决这个问题的第二种方法是使用回调类 https://keras.io/callbacks/#callback并至少定义on_epoch_end
函数,然后你可以调用sklearn
roc_auc_score
从那里打印出来或保存到日志中。
但是,到目前为止我发现,您需要通过以下方式为其提供训练数据:__init__
,因此对于生成器,您需要确保回调的生成器提供与模型的拟合生成器相同的数据。另一方面,对于验证生成器,可以使用回调类来访问它self.validation_data
,与提供给的相同fit_generator
.