Я наткнулся на ошибку, которую не могу устранить. Я пытаюсь сделать следующее:
Я хочу обучить (фиктивную) модель, которая добавляет 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». Не должно ли имя загружаться при восстановлении контрольной точки? Кажется, что тензоры имеют правильные имена и значения, когда я проверяю тензоры в файле контрольных точек.