2017-01-12 4 views
1

Я хочу сохранить модель 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) 
+0

Возможный дубликат [Tensorflow: как восстановить ранее сохраненную модель (python)] (http://stackoverflow.com/questions/33759623/tensorflow-how-to-restore-a-previously-saved-model-python) – Kashyap

ответ

1

Я пытался выяснить то же самое и смог успешно это сделать, используя Supervisor. Он автоматически загружает все переменные и ваш график и т. Д. Вот документация - https://www.tensorflow.org/programmers_guide/supervisor. Ниже мой код -

sv = tf.train.Supervisor(logdir="/checkpoint', save_model_secs=60) 
    with sv.managed_session() as sess: 
     if not sv.should_stop(): 
      #Do run/eval/train ops on sess as needed. Above works for both saving and loading 

Как вы видите, это гораздо проще, чем при использовании Saver объекта и иметь дело с отдельными переменными и т.д., пока граф остается неизменным (я понимаю, что Saver удобна, когда мы хотим для повторного использования предварительно подготовленной модели для другого графика).

1

Question1

Этот вопрос был уже ответил тщательно here. Вам не нужно явно называть export_meta_graph. Позвоните по телефону save method. Это создаст файл .meta также (так как метод экономии будет вызывать метод export_meta_graph внутри.)

Например

saver0.save(sess, './myModel.ckpt')

будет производить myModel.ckpt файл, а также файл myModel.ckpt.meta.

Затем вы можете восстановить модель с помощью

with tf.Session() as sess: 
    saver1 = tf.train.import_meta_graph('./myModel.ckpt.meta') 
    saver1.restore(sess, './myModel') 
    print sess.run(myVar) 

question2

Коллекция используется для хранения специальной информации, как скорость обучения, коэффициент регуляризации, который вы использовали и другую информацию и их будут сохранены при экспорте графика. Сам Tensorflow определяет некоторые коллекции, такие как «TRAINABLE_VARIABLES», которые используются для получения всех обучаемых переменных модели, которую вы построили. Вы можете выбрать экспорт всех коллекций в вашем графике или указать, какие коллекции экспортировать в функции export_meta_graph.

Да tensorflow будет экспортировать все переменные, которые вы определяете. Но если вам нужна другая информация, которую нужно экспортировать на график, они могут быть добавлены в коллекцию.

+0

Спасибо Kashyap. Я пробовал этот метод, но до сих пор не добился успеха. Я добавил детали в исходное сообщение выше. –

+0

Я обновил свой пост ... Новый код должен работать и разъяснять, почему добавление переменных в коллекцию необязательно – Kashyap

+0

Странно. Когда я запускаю ваш код, сначала с mode = save, а затем mode = load, я получаю 'NameError: name 'myVar' не определен'. Я использую Tensorflow 0.12.0 и Python 2.7.11. –

Смежные вопросы