Ошибка при восстановлении переменной - PullRequest
0 голосов
/ 03 июля 2018

Я наткнулся на ошибку, которую не могу устранить. Я пытаюсь сделать следующее:

Я хочу обучить (фиктивную) модель, которая добавляет a к b на каждой итерации. Когда закончите, я хочу сохранить переменные в качестве контрольной точки. Когда я запускаю его в первый раз, он будет создавать модель с нуля. Каждый раз, когда я перезапускаю модель, она должна начинаться с последней контрольной точки и делать дополнения снова. Я загружаю полный график из файла .meta. Глобальная переменная шага предназначена для отслеживания общего количества пройденных шагов.

import tensorflow as tf
from tensorflow.python.tools.inspect_checkpoint import print_tensors_in_checkpoint_file

# List ALL tensors.
print_tensors_in_checkpoint_file(tf.train.latest_checkpoint('./'), all_tensors=True, tensor_name='')

tf.reset_default_graph()

global_step = tf.get_variable('global_step', shape=[], dtype=tf.int32, initializer=tf.constant_initializer(0), trainable=False)

def model(a, b):
    b = tf.assign_add(b, a)
    return b

with tf.Session() as sess:

    ckpt = tf.train.latest_checkpoint('./')
    if ckpt:
        saver = tf.train.import_meta_graph('./my_test_model-1.meta')
        saver.restore(sess, ckpt)

    else:
        a = tf.Variable(3.0, name='a')
        b = tf.Variable(5.0, name='b')

        b = model(a, b)

        ### before EDIT
        saver = tf.train.Saver()
        sess.run(tf.global_variables_initializer())
        ###

        ### after EDIT
        sess.run(tf.global_variables_initializer())
        saver = tf.train.Saver()
        ###

    for step in range(5):
        global_step.assign_add(1).eval()
        print(global_step.eval())
        print(b.eval())

        saver.save(sess, './my_test_model', global_step=global_step)

Скрипт работает нормально в первый раз, выводя это:

1        # step
8.0      # value of b
2
11.0
3
14.0
4
17.0
5
20.0

Во второй раз, когда я запускаю программу, я получаю этот вывод с последующей ошибкой:

tensor_name:  a
3.0
tensor_name:  b
20.0
tensor_name:  global_step
0
tensor_name:  global_step_1
5

INFO:tensorflow:Restoring parameters from ./my_test_model-5

Traceback (последний вызов был последним): ... FailedPreconditionError: Попытка использовать неинициализированное значение global_step [[Node: AssignAdd_2 = AssignAdd [T = DT_INT32, use_locking = false, _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] (global_step, AssignAdd_2 / value)]] ...

В первый раз ясно, что он не выдаст ошибку, так как я запускаю инициализатор для всех переменных. Но я думал, что восстановление модели считается своего рода инициализацией? Я действительно не могу обернуть голову вокруг этой концепции. Я также попытался определить global_step после определения a и b, но это привело к другой ошибке при первой загрузке:

ValueError: Невозможно использовать сеанс по умолчанию для оценки тензора: Тензорный график отличается от графика сессии. Передать явное сеанс до eval(session=sess). Ошибка относится к строке, которая увеличивается global_step (global_step.assign_add(1).eval()).

Что я делаю не так? Где я должен определить переменную?

Я ценю любую помощь по этой проблеме! Спасибо, что прочитали это далеко.

EDIT: Благодаря @Diana ошибка предусловия исчезла. К сожалению, произошла другая ошибка. Каждый раз, когда скрипт запускается с загрузкой контрольной точки, он выдает ошибку имени:

NameError: имя 'global_step' не определено.

Это также происходит для переменной «b». Не должно ли имя загружаться при восстановлении контрольной точки? Кажется, что тензоры имеют правильные имена и значения, когда я проверяю тензоры в файле контрольных точек.

1 Ответ

0 голосов
/ 03 июля 2018

Вы должны объявить заставку после запуска инициализации. В противном случае вы не сохраняете никакого значения. Как хранитель этого не знает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...