这个想法是建立一个具有良好指标的TensorBoard来跟踪我的模型培训和评估模型性能。然而,大多数指标似乎不正确(尤其是精确度/召回率/假阴性计数),我使用的是tfv1.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]
我使用以下方法编译模型:
^{pr2}$适合使用
model.fit_generator(generator=KerasSequence)
我的数据是不平衡的,我有大约2%的观察属于+ve类。让我们看看最后几个时代。在
Epoch 16/50 6/7 [========================>.....] - ETA: 0s - loss: 5.9874 - auc: 0.9171 - recall: 1.0000 - precision: 0.0068 - sensitivity_at_specificity: 0.8050 - mean_per_class_accuracy: 0.5000 - false_negatives: 0.0000e+00 - false_positives: 13570.6667 - binary_accuracy: 1.0000
Epoch 50/50 6/7 [========================>.....] - ETA: 0s - loss: 0.0205 - auc: 0.9207 - recall: 1.0000 - precision: 0.0069 - sensitivity_at_specificity: 0.8494 - mean_per_class_accuracy: 0.5000 - false_negatives: 0.0000e+00 - false_positives: 43821.6667 - binary_accuracy: 1.0000
我知道500个样本中有6个被预测为+ve类。所以我不明白怎么可能有这些指标。它们相互排斥。回忆1和精度如此之低。这意味着我实际上预测所有观察值为1,而实际上只有5/500被预测为+ve类。另外,怎么可能在43000时得到false_positive
计数。。。当我只有500个训练样本的时候。它在每一个时代都在成长
损失为0(过拟合),但假阳性计数每历元增加。。。为什么?有趣的是,在第一个时期之后,假阳性计数为200。这让我意识到指标在纪元结束后不会重新设置并继续添加。在
目前没有回答
相关问题 更多 >
编程相关推荐