Я не могу успешно запустить модуль optimize_for_inference
на простом, сохраненном графике TensorFlow (Python 2.7; пакет, установленный pip install tensorflow-gpu==1.0.1
).
Фон
Сохранение графика TensorFlow
Здесь мой скрипт Python для создания и сохранения простого графика для добавления 5 к моей операции ввода x
placeholder
.
import tensorflow as tf
# make and save a simple graph
G = tf.Graph()
with G.as_default():
x = tf.placeholder(dtype=tf.float32, shape=(), name="x")
a = tf.Variable(5.0, name="a")
y = tf.add(a, x, name="y")
saver = tf.train.Saver()
with tf.Session(graph=G) as sess:
sess.run(tf.global_variables_initializer())
out = sess.run(fetches=[y], feed_dict={x: 1.0})
print(out)
saver.save(sess=sess, save_path="test_model")
Восстановление графика TensorFlow
У меня есть простой скрипт восстановления, который воссоздает сохраненный график и восстанавливает параметры графа. Оба сценария сохранения/восстановления производят один и тот же вывод.
import tensorflow as tf
# Restore simple graph and test model output
G = tf.Graph()
with tf.Session(graph=G) as sess:
# recreate saved graph (structure)
saver = tf.train.import_meta_graph('./test_model.meta')
# restore net params
saver.restore(sess, tf.train.latest_checkpoint('./'))
x = G.get_operation_by_name("x").outputs[0]
y = G.get_operation_by_name("y").outputs
out = sess.run(fetches=[y], feed_dict={x: 1.0})
print(out[0])
Попытка оптимизации
Но, хотя я не ожидаю многого с точки зрения оптимизации, когда я пытаюсь оптимизировать график для вывода, я получаю следующее сообщение об ошибке. Ожидаемый выходной узел не отображается в сохраненном графике.
$ python -m tensorflow.python.tools.optimize_for_inference --input test_model.data-00000-of-00001 --output opt_model --input_names=x --output_names=y
Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/{path}/lib/python2.7/site-packages/tensorflow/python/tools/optimize_for_inference.py", line 141, in <module>
app.run(main=main, argv=[sys.argv[0]] + unparsed)
File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/platform/app.py", line 44, in run
_sys.exit(main(_sys.argv[:1] + flags_passthrough))
File "/{path}/lib/python2.7/site-packages/tensorflow/python/tools/optimize_for_inference.py", line 90, in main
FLAGS.output_names.split(","), FLAGS.placeholder_type_enum)
File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/tools/optimize_for_inference_lib.py", line 91, in optimize_for_inference
placeholder_type_enum)
File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/tools/strip_unused_lib.py", line 71, in strip_unused
output_node_names)
File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/framework/graph_util_impl.py", line 141, in extract_sub_graph
assert d in name_to_node_map, "%s is not in graph" % d
AssertionError: y is not in graph
Дальнейшие исследования привели меня к проверке контрольной точки сохраненного графика, который показывает только 1 тензор (a
, no x
и no y
).
(tf-1.0.1) $ python -m tensorflow.python.tools.inspect_checkpoint --file_name ./test_model --all_tensors
tensor_name: a
5.0
Специальные вопросы
- Почему я не вижу
x
иy
на контрольной точке? Это потому, что они являются операциями, а не тензорами? - Поскольку мне нужно предоставить имена ввода и вывода для модуля
optimize_for_inference
, как мне построить график, чтобы я мог ссылаться на входные и выходные узлы?