TensorFlow FailedPreconditionError при использовании переменных из модуля tf.metric

Я попытался добавить некоторые дополнительные измерения в свой обучающий код для CNN, используя функции из подмодуля tf.metrics, такие как tf.metrics.accuracy(y_labels, y_predicted) и эквиваленты для точности или отзыва. Это сделано в отличие от большинства их руководств, где они предлагают запутанные:

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

В то время как моя реализация заменяет эту строку на:

accuracy = tf.metrics.accuracy(y_labels, y_predicted)

Теперь, несмотря на то, что я выполняю sess.run(tf.initialize_all_variables()) в своем блоке with tf.Session() as sess:, я все равно получаю следующую ошибку при попытке использовать функцию tf.metrics.accuracy:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value performance/accuracy/count
 [[Node: performance/accuracy/count/read = Identity[T=DT_FLOAT, _class=["loc:@performance/accuracy/count"], _device="/job:localhost/replica:0/task:0/cpu:0"](performance/accuracy/count)]]

В частности, замена строки accuracy = tf.metrics.accuracy(y_labels, y_predicted) на accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) устраняет проблему, однако я хотел бы реализовать другие показатели, такие как точность, полнота и т. д., не делая это вручную.


person Bruno KM    schedule 07.07.2017    source источник


Ответы (2)


TL;DR: добавьте следующую строку в начале сеанса:

sess.run(tf.local_variables_initializer())

Путаница возникает из-за названия (как указывает frankyjuang) устаревшей функции tf.initialize_all_variables(). Эта функция устарела отчасти из-за неправильного названия: на самом деле она не инициализирует все переменные, а только инициализирует глобальные (не локальные ) переменные. Согласно документации для функции tf.metrics.accuracy() (выделение добавлено):

Функция accuracy создает две локальные переменные, total и count, которые используются для вычисления частоты, с которой predictions соответствует labels.

Поэтому вам необходимо добавить явный шаг инициализации для локальных переменных, что можно сделать с помощью tf.local_variables_initializer() , как было предложено выше.

person mrry    schedule 10.07.2017

sess.run(tf.initialize_all_variables()) устарел.

Вместо этого используйте sess.run(tf.global_variables_initializer()), чтобы решить проблему.

Справка

Согласно документу tf.initialize_all_variables,

ЭТА ФУНКЦИЯ УСТАРЕЛА. Он будет удален после 2017-03-02. Инструкции по обновлению: вместо этого используйте tf.global_variables_initializer.

person YLJ    schedule 07.07.2017
comment
Я также пробовал tf.global_variables_initializer(). К счастью, как заметил mrry, initialize_all_variables на самом деле не инициализирует все переменные, как я думал. tf.local_variables_initializer() отлично подходит для этого варианта использования. - person Bruno KM; 11.07.2017