Я хочу сохранить модель Tensorflow (0.12.0), включая графики и значения переменных, а затем загрузить и выполнить ее. Я прочитал документы и другие сообщения об этом, но не могу заставить основы работать. Я использую технику от this page in the Tensorflow docs. Код:Сохранение и загрузка модели Tensorflow
Сохранить простую модель:
myVar = tf.Variable(7.1)
tf.add_to_collection('modelVariables', myVar) # why?
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print sess.run(myVar)
saver0 = tf.train.Saver()
saver0.save(sess, './myModel.ckpt')
saver0.export_meta_graph('./myModel.meta')
Позже нагрузки и выполнить модель:
with tf.Session() as sess:
saver1 = tf.train.import_meta_graph('./myModel.meta')
saver1.restore(sess, './myModel.meta')
print sess.run(myVar)
Вопрос 1: Код экономии, кажется, работает, но код загрузки производит этот ошибка:
W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open ./myModel.meta: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator?
Как исправить это ?.
Вопрос 2: я включил эту линию, чтобы следовать шаблону в документации TF ...
tf.add_to_collection('modelVariables', myVar)
... но почему эта линия нужна? Не expert_meta_graph
экспортировать весь график по умолчанию? Если нет, нужно ли добавлять каждую переменную в граф к коллекции до сохранения? Или мы просто добавляем в коллекцию те переменные, которые будут доступны после восстановления?
---------------------- Обновление от 12 января 2017 года ------------------ -----------
Частичный успех, основанный на предложении Кашиапа ниже, но тайна все еще существует. Код ниже работает , но, только если я включаю строки, содержащие tf.add_to_collection
и tf.get_collection
. Без этих линий режим «загрузки» выдает ошибку в последней строке: NameError: name 'myVar' is not defined
. Я понял, что по умолчанию Saver.save
сохраняет и восстанавливает все переменные в графике, поэтому почему нужно указывать имя переменных, которые будут использоваться в коллекции? Я предполагаю, что это связано с отображением имен переменных Tensorflow в именах Python, но какие здесь правила игры? Для каких переменных это нужно сделать?
mode = 'load' # or 'save'
if mode == 'save':
myVar = tf.Variable(7.1)
init_op = tf.global_variables_initializer()
saver0 = tf.train.Saver()
tf.add_to_collection('myVar', myVar) ### WHY NECESSARY?
with tf.Session() as sess:
sess.run(init_op)
print sess.run(myVar)
saver0.save(sess, './myModel')
if mode == 'load':
with tf.Session() as sess:
saver1 = tf.train.import_meta_graph('./myModel.meta')
saver1.restore(sess, tf.train.latest_checkpoint('./'))
myVar = tf.get_collection('myVar')[0] ### WHY NECESSARY?
print sess.run(myVar)
Возможный дубликат [Tensorflow: как восстановить ранее сохраненную модель (python)] (http://stackoverflow.com/questions/33759623/tensorflow-how-to-restore-a-previously-saved-model-python) – Kashyap