如何在使用 fit_generator 和 evaluate_generator 训练我的网络时绘制 AUC 和 ROC?
Posted
技术标签:
【中文标题】如何在使用 fit_generator 和 evaluate_generator 训练我的网络时绘制 AUC 和 ROC?【英文标题】:How can I plot AUC and ROC while using fit_generator and evaluate_generator to train my network? 【发布时间】:2019-05-02 05:55:48 【问题描述】:我正在使用生成器来训练和预测我的数据的分类。这是ImageDataGenerator的示例
from keras.preprocessing.image import ImageDataGenerator
batch_size = 16
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'data/train', # this is the target directory
target_size=(150, 150),
batch_size=batch_size,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
'data/validation',
target_size=(150, 150),
batch_size=batch_size,
class_mode='binary')
model.fit_generator(
train_generator,
steps_per_epoch=2000 // batch_size,
epochs=50,
validation_data=validation_generator,
validation_steps=800 // batch_size)
model.save_weights('first_try.h5') # always save your weights after training or during training
我的问题是当我使用fit_generator
时如何创建AUC and ROC?
【问题讨论】:
使用标准 sklearn 的 roc 和 auc 功能有什么问题? @Julien 我在使用生成器时该怎么做? 你试过什么?不知道是什么问题... @Julien,坦率地说,我不确定如何将sklearn.metrics.roc_auc_score
与生成器一起使用。
【参考方案1】:
我认为在这种情况下您最好的选择是将 AUC 定义为一个新指标。为此,您必须在 tensorflow 中定义指标(我假设您使用的是 tensorflow 后端)。
我之前尝试过的一种方法(但是,我不记得我测试过结果的正确性)是这样的:
def as_keras_metric(method):
"""
This is taken from:
https://***.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')
虽然这会吐出数字,但我还没有确定它们是否正确。如果您能够对此进行测试,并且它给出了正确的结果,请告诉我,我很想知道。
解决此问题的第二种方法是使用callback class 并至少定义on_epoch_end
函数,然后您可以从那里调用sklearn
roc_auc_score
并打印输出或保存到日志.
但是,到目前为止,我发现,您需要通过__init__
为其提供训练数据,因此对于生成器,您需要确保回调的生成器提供与模型拟合相同的数据发电机。另一方面,对于验证生成器,可以使用self.validation_data
从回调类中访问它,这与提供给fit_generator
的方法相同。
【讨论】:
如何在回调函数中访问与模型拟合生成器相同的数据?我只是不知道细节。您可以为此添加一个示例吗?谢谢,以上是关于如何在使用 fit_generator 和 evaluate_generator 训练我的网络时绘制 AUC 和 ROC?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Keras中使用fit_generator()来加权? [关闭]
如何在 keras fit_generator() 中定义 max_queue_size、workers 和 use_multiprocessing?
使用 keras.utils.Sequence 和 keras.model.fit_generator 时出现 KeyError。
keras训练函数fit和fit_generator对比,图像生成器ImageDataGenerator数据增强