这个想法是建立具有良好指标的TensorBoard,以跟踪我的模型训练并评估模型性能。但是,大多数指标似乎不正确(特别是精度/召回率/ false_negative_count),我正在使用tf v1.8.0。
要创建指标,我使用以下代码:
def as_keras_metric(method, **kwargs):
@functools.wraps(method)
def wrapper(self, args):
""" Wrapper for turning tensorflow metrics into keras metrics """
value, update_op = method(self, 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
def create_metrics():
auc_roc = as_keras_metric(tf.metrics.auc)
recall = as_keras_metric(tf.metrics.recall)
precision = as_keras_metric(tf.metrics.precision)
fn = as_keras_metric(tf.metrics.false_negatives)
fp = as_keras_metric(tf.metrics.false_positives)
kwargs = {'specificity': 0.95}
sensitivity_at_specificity = as_keras_metric(tf.metrics.sensitivity_at_specificity, **kwargs)
mean_per_class_accuracy = as_keras_metric(tf.metrics.mean_per_class_accuracy, **{'num_classes': 2})
return [fn, fp, auc_roc, recall, precision, sensitivity_at_specificity, mean_per_class_accuracy, tf.keras.metrics.binary_accuracy]
我使用以下方法编译模型:
model.compile(loss='binary_crossentropy', optimizer='adadelta', metrics=create_metrics())
并使用
拟合 model.fit_generator(generator=KerasSequence)
我的数据不平衡,大约有2%的观测属于+ ve类。让我们看看最后几个时期。
Epoch 16/50 6/7 [======================== .....]-ETA:0秒-损失: 5.9874-auc:0.9171-召回率:1.0000-精度:0.0068-特异性灵敏度:0.8050-均值精度:0.5000- false_negatives:0.0000e + 00-false_positives:13570.6667- binary_accuracy:1.0000
Epoch 50/50 6/7 [======================== .....]-ETA:0秒-损失: 0.0205-AUC: 0.9207-召回率:1.0000-精度:0.0069-特有灵敏度:0.8494-平均每类精度:0.5000- false_negatives:0.0000e + 00-false_positives:43821.6667- binary_accuracy:1.0000
我知道500个样本中有6个被预测为+ ve类。因此,我不知道如何拥有这些指标。它们是互斥的。召回1和精度是如此之低。这表明我实际上对所有观察都预测为1,而实际上只有5/500被预测为+ ve级。另外,当我只有500个训练样本时,怎么可能在43000处获得false_positive
的计数。它随着每个时代的发展而增长
损失变为0(过度拟合),但是误报数每纪元增加...为什么?有趣的是,在第一个时期之后,误报计数为200。这使我感到,在时期结束后指标不会重新设置并不断添加。