нахождение точности модели тензорного потока

Я пытался найти точность после обучения этой простой линейной модели с сигмоидной функцией:

import numpy as np
import tensorflow as tf
import _pickle as cPickle

with open("var_x.txt", "rb") as fp:   # Unpickling
    var_x = cPickle.load(fp)

with open("var_y.txt", "rb") as fp:   # Unpickling
    var_y = cPickle.load(fp)

with open("var_x_test.txt", "rb") as fp:   # Unpickling
    var_x_test = cPickle.load(fp)

with open("var_y_test.txt", "rb") as fp:   # Unpickling
    var_y_test = cPickle.load(fp)

def model_fn(features, labels, mode):
  # Build a linear model and predict values
  W = tf.get_variable("W", [4], dtype=tf.float64)
  b = tf.get_variable("b", [1], dtype=tf.float64)
  y = tf.sigmoid( tf.reduce_sum(W*features['x']) + b)
  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=y)

  loss = tf.reduce_sum(tf.square(y - labels))

  global_step = tf.train.get_global_step()
  optimizer = tf.train.GradientDescentOptimizer(0.01)
  train = tf.group(optimizer.minimize(loss),
                   tf.assign_add(global_step, 1))

  return tf.estimator.EstimatorSpec(
      mode=mode,
      predictions=y,
      loss=loss,
      train_op=train)

estimator = tf.estimator.Estimator(model_fn=model_fn)

x_train = np.array(var_x)
y_train = np.array(var_y)
x_test = np.array(var_x_test)
y_test = np.array(var_y_test)

input_fn = tf.estimator.inputs.numpy_input_fn(
    {"x": x_train}, y_train, batch_size=4, num_epochs=60, shuffle=True)

estimator.train(input_fn=input_fn, steps=1000)

test_input_fn= tf.estimator.inputs.numpy_input_fn(
    x ={"x":np.array(x_test)},
    y=np.array(y_test),
    num_epochs=1,
    shuffle=False
    )

accuracy_score = estimator.evaluate(input_fn=test_input_fn["accuracy"])

print(accuracy_score)

Но в словаре нет ключа "точности". Как мне его найти? Кроме того, как мне использовать тензорную доску для отслеживания точности после каждого шага?

Заранее спасибо, учебник по тензорному потоку очень плохо объясняет.


person Werner Germán Busch    schedule 23.01.2018    source источник


Ответы (3)


Вам необходимо самостоятельно создать точность в model_fn с помощью tf.metrics.accuracy и передать его в eval_metric_ops, который будет возвращен функцией.

def model_fn(features, labels, mode):
    # define model...
    y = tf.nn.sigmoid(...)
    predictions = tf.cast(y > 0.5, tf.int64)
    eval_metric_ops = {'accuracy': tf.metrics.accuracy(labels, predictions)}
    #...
    return tf.estimator.EstimatorSpec(mode=mode, train_op=train_op, 
        loss=loss, eval_metric_ops=eval_metric_ops)

Затем выходные данные estimator.evaluate() будут содержать ключ точности, который будет содержать точность, вычисленную на проверочном наборе.

metrics = estimator.evaluate(test_input_fn)
print(metrics['accuracy'])
person Olivier Moindrot    schedule 23.01.2018
comment
Я сделал то, что вы сказали, но выдает ошибку NameError: имя «предсказания» не определено. - person Werner Germán Busch; 23.01.2018
comment
Вы должны сами определить это так: tf.argmax(y, axis=1) - person Olivier Moindrot; 23.01.2018
comment
В вашем случае вы должны использовать predictions = tf.cast(y > 0.5, tf.int64) извините (прогнозируйте 1, когда выход сигмоида выше 0,5). Я обновил ответ. - person Olivier Moindrot; 23.01.2018
comment
Ссылка не работает, это правильный? tensorflow.org/api_docs/python/tf/keras/metrics/Accuracy < / а> - person pevik; 11.03.2020

accuracy_score = estimator.evaluate(input_fn=test_input_fn)
print(accuracy_score["loss"]) 

Вы можете получить потерю, как описано выше для точности.

person chengpohi    schedule 23.01.2018
comment
не работает, словарь не имеет ключевой точности. - person Werner Germán Busch; 23.01.2018

person    schedule
comment
Ответы только на код не особенно полезны. Включите краткое описание того, как этот код решает проблему. - person Shree; 07.05.2021