DNNClassifier
のTensorFlowでF1スコアをカスタムメトリックとして定義しようとしています。これを行うには、私は、関数F1スコアをcalulateするTensorFlowからstreaming_precision
とstreaming_recall
を使用していますテンソルのストリーミングメトリクスに基づくカスタムメトリックがNaNを返す
def metric_fn(predictions=[], labels=[], weights=[]):
P, _ = tf.contrib.metrics.streaming_precision(predictions, labels)
R, _ = tf.contrib.metrics.streaming_recall(predictions, labels)
if P + R == 0:
return 0
return 2*(P*R)/(P+R)
を書きました。私は、正しい精度と再現率の値を取得しますが、しかし、
validation_metrics = {
"accuracy":
tf.contrib.learn.MetricSpec(
metric_fn=tf.contrib.metrics.streaming_accuracy,
prediction_key=tf.contrib.learn.PredictionKey.CLASSES),
"precision":
tf.contrib.learn.MetricSpec(
metric_fn=tf.contrib.metrics.streaming_precision,
prediction_key=tf.contrib.learn.PredictionKey.CLASSES),
"recall":
tf.contrib.learn.MetricSpec(
metric_fn=tf.contrib.metrics.streaming_recall,
prediction_key=tf.contrib.learn.PredictionKey.CLASSES),
"f1score":
tf.contrib.learn.MetricSpec(
metric_fn=metric_fn,
prediction_key=tf.contrib.learn.PredictionKey.CLASSES)
}
f1score
は常にnan
です:その後、私はvalidation_metricsに新しいエントリを作っ
INFO:tensorflow:Saving dict for global step 151: accuracy = 0.982456, accuracy/baseline_label_mean = 0.397661, accuracy/threshold_0.500000_mean = 0.982456, auc = 0.982867, f1score = nan, global_step = 151, labels/actual_label_mean = 0.397661, labels/prediction_mean = 0.406118, loss = 0.310612, precision = 0.971014, precision/positive_threshold_0.500000_mean = 0.971014, recall = 0.985294, recall/positive_threshold_0.500000_mean = 0.985294
何かが私のmetric_fn
が間違っているが、私それを理解することはできません。 metric_fn
によって得られた値P
およびR
は、 Tensor("precision/value:0", shape=(), dtype=float32)
の形式です。私はこれがちょっと奇妙だと思う。私はスカラーテンソルを期待していた。
何か助けていただければ幸いです。
を使用することができます動作します、ありがとうございました。しかし、return文の最初の部分には構文エラー( '')がありません)が少しあります。 – TheWaveLad
@ TheWaveLadの世話をして、thx – user1735003