2016-11-25 8 views
0

Я пытаюсь восстановить сохраненную переменную в tensorflow. Похоже, это очень сложно.Как восстановить сохраненную переменную в тензорном потоке?

Я использую реализацию alexnet в http://www.cs.toronto.edu/~guerzhoy/tf_alexnet/

в файле питона, alexnet.py, я определяю переменную

conv5W = tf.Variable(net_data["conv5"][0],name='conv5w') 

тогда я точно настроить модель, и я вижу, что некоторые из ее значения изменилось. Я сохранить отладили модель, набрав:

saver = tf.train.Saver() 
saver.save(sess,"modelname.ckpt") 

после этого, я открываю новую консоль IPython и запуск:

from alexnet import * 
sess=tf.InteractiveSession() 
new_saver = tf.train.import_meta_graph("modelname.ckpt.meta") 
new_saver.restore(sess, "modelname.ckpt") 

после того, когда я пытаюсь получить значения переменных с:

conv5W.eval(session=sess) 

это дает:

FailedPreconditionError: Attempting to use uninitialized value conv5w 
    [[Node: conv5w/_98 = _Send[T=DT_FLOAT, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_conv5w", _device="/job:localhost/replica:0/task:0/gpu:0"](conv5w)]] 
    [[Node: conv5w/_99 = _Recv[_start_time=0, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_conv5w", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

с другой стороны, если я инициализировать переменную:

init = tf.initialize_all_variables() 
sess.run([init]) , 

на этот раз она дает начальные значения в net_data["conv5"][0], а не отладили те,

ответ

0

Восстановление из мета графа готовит график, а не данные. Восстановление данных требует добавления во время обучения значений, которые вы хотите восстановить для объектов коллекции, и перезагрузки этих коллекций во время восстановления. official tutorial показывает, как (на самом деле, есть другой способ, см. Ниже).

Другой способ - восстановить график (tf.write_graph и tf.import_graph_def), а затем восстановить все переменные с контрольной точки. Официальные учебные пособия, похоже, ведут больше к этому методу контрольной точки (см. Ссылку выше). Метаграфический график скорее предназначен для распределенной обработки, что требует большей работы и ухода.

0

Эрик ответил на большинство ваших вопросов. я сталкивался с подобной проблемой и простой обходной путь к нему:

  1. Re нагрузки либо весь график или импортировать его мета-граф (бывший в рекомендуется, если вы новичок). Вы до сих пор не запустить восстановление функцию
  2. Запустить сеанс и инициализировать все переменные
  3. Восстанавливать (с использованием tf.train.Saver) контрольной точки

Проблема с вашего дела в том, что при запуске tf.initialize_all_variables() после восстановления, Тензорный поток сбрасывает их до начальных значений, и вы теряете свои тонко настроенные веса.