评估期间 Experimenter 中的张量流混淆矩阵
tensorflow confusion matrix in Experimenter during evaluation
我在使用 Tensorflow 和 Experimenter 进行模型评估时遇到了一些问题 API。
我曾经使用 2-类 NN 工作,但这次我设法训练了一个 4-类 神经网络,我需要弄清楚如何在这种情况下构建混淆矩阵.我尝试使用 tf.confusion_matrix
函数,但它根本不起作用。
这是我使用的代码片段:
if mode == ModeKeys.EVAL:
eval_metric_ops = {
'accuracy' : metrics.streaming_accuracy(predictions=predicted_classes, labels=labels),
# Other metrics...
'confusion_matrix': tf.confusion_matrix(prediction=predicted_classes, label=labels, num_classes=4)
}
return tf.estimator.EstimatorSpec(
mode=mode,
predictions=predicted_classes,
loss=loss,
eval_metric_ops=eval_metric_ops
)
这是我得到的错误:
TypeError: Values of eval_metric_ops must be (metric_value, update_op) tuples, given: (<tf.Operation 'test/group_deps' type=NoOp>, <tf.Tensor 'test/accuracy/value:0' shape=() dtype=float32>, <tf.Variable 'test/confusion:0' shape=(4, 4) dtype=int32_ref>) for key: confusion_matrix
我阅读了有关在 Tensorflow 中创建混淆矩阵的其他答案,并且了解了如何操作,但我认为我的问题与 Estimator/Experimenter API.
请使用 tf.metrics.* 或 tf.contrib.metrics.* 进行指标计算。写一个当前的指标行为有一些微妙的事情。
tf.contrib.metrics 中有一些实用程序,例如 streaming_true_positives,您可能会发现它们很有用。
您的代码不起作用,因为框架期望 eval_metric_ops 是一个字典,其中包含具有操作名称的键和元组类型的值(结果张量,此张量的 update_operation)
tf.confusion_matrix(prediction=predicted_classes, label=labels, num_classes=4) 只有 returns 预期的张量。
您必须像这样实现自己的指标操作:
def eval_confusion_matrix(labels, predictions):
with tf.variable_scope("eval_confusion_matrix"):
con_matrix = tf.confusion_matrix(labels=labels, predictions=predictions, num_classes=4)
con_matrix_sum = tf.Variable(tf.zeros(shape=(4,4), dtype=tf.int32),
trainable=False,
name="confusion_matrix_result",
collections=[tf.GraphKeys.LOCAL_VARIABLES])
update_op = tf.assign_add(con_matrix_sum, con_matrix)
return tf.convert_to_tensor(con_matrix_sum), update_op
# Add evaluation metrics (for EVAL mode)
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(labels, predicted_classes),
"conv_matrix": eval_confusion_matrix(
labels, predicted_classes)
}
我在使用 Tensorflow 和 Experimenter 进行模型评估时遇到了一些问题 API。
我曾经使用 2-类 NN 工作,但这次我设法训练了一个 4-类 神经网络,我需要弄清楚如何在这种情况下构建混淆矩阵.我尝试使用 tf.confusion_matrix
函数,但它根本不起作用。
这是我使用的代码片段:
if mode == ModeKeys.EVAL:
eval_metric_ops = {
'accuracy' : metrics.streaming_accuracy(predictions=predicted_classes, labels=labels),
# Other metrics...
'confusion_matrix': tf.confusion_matrix(prediction=predicted_classes, label=labels, num_classes=4)
}
return tf.estimator.EstimatorSpec(
mode=mode,
predictions=predicted_classes,
loss=loss,
eval_metric_ops=eval_metric_ops
)
这是我得到的错误:
TypeError: Values of eval_metric_ops must be (metric_value, update_op) tuples, given: (<tf.Operation 'test/group_deps' type=NoOp>, <tf.Tensor 'test/accuracy/value:0' shape=() dtype=float32>, <tf.Variable 'test/confusion:0' shape=(4, 4) dtype=int32_ref>) for key: confusion_matrix
我阅读了有关在 Tensorflow 中创建混淆矩阵的其他答案,并且了解了如何操作,但我认为我的问题与 Estimator/Experimenter API.
请使用 tf.metrics.* 或 tf.contrib.metrics.* 进行指标计算。写一个当前的指标行为有一些微妙的事情。 tf.contrib.metrics 中有一些实用程序,例如 streaming_true_positives,您可能会发现它们很有用。
您的代码不起作用,因为框架期望 eval_metric_ops 是一个字典,其中包含具有操作名称的键和元组类型的值(结果张量,此张量的 update_operation)
tf.confusion_matrix(prediction=predicted_classes, label=labels, num_classes=4) 只有 returns 预期的张量。
您必须像这样实现自己的指标操作:
def eval_confusion_matrix(labels, predictions): with tf.variable_scope("eval_confusion_matrix"): con_matrix = tf.confusion_matrix(labels=labels, predictions=predictions, num_classes=4) con_matrix_sum = tf.Variable(tf.zeros(shape=(4,4), dtype=tf.int32), trainable=False, name="confusion_matrix_result", collections=[tf.GraphKeys.LOCAL_VARIABLES]) update_op = tf.assign_add(con_matrix_sum, con_matrix) return tf.convert_to_tensor(con_matrix_sum), update_op # Add evaluation metrics (for EVAL mode) eval_metric_ops = { "accuracy": tf.metrics.accuracy(labels, predicted_classes), "conv_matrix": eval_confusion_matrix( labels, predicted_classes) }