TF-Lite-Converter с удлиненным трубопроводом Tensorflow (пример трубопровода Chicago Taxi)
Цель: TFX -> TF Lite Converter -> Развертывание моделей на мобильных устройствах / устройствах IoT
В настоящее время я изучаю Tensorflow Extended на примере Chicago Taxi Pipeline. Конвейер работает (хотя и через много трудностей), и компонент Pusher выпустил файл Tensorflow SavedModel (.pb).
Тем не менее, здесь возникает новая проблема: с помощью Tensorflow nightly/1.13.1 (пробовал оба) и Python 2.7.6 я могу сгенерировать, сохранить и загрузить SavedModel (модель для сбора цифр mnist для тестирования утилиты) с некоторыми простыми код Python, такой как saved_model.simple_save
а также saved_model.loader.load
, но я продолжаю сталкиваться с ошибками при применении к моделям, которые излучает TFX Pusher, следующим образом.
(Может я что-то не так сделал с TFX Pipeline?)
Код, который я использовал:
import tensorflow as tf
with tf.Session(graph=tf.Graph()) as sess:
tf.compat.v1.saved_model.loader.load(sess, ["serve"], "/home/tigerpaws/taxi/serving_model/taxi_simple/1553187887")#"/home/tigerpaws/saved_model_example/model")
graph=tf.get_default_graph()
Ошибка:
KeyError Traceback (most recent call last)
<ipython-input-11-a6978b82c3d2> in <module>()
1 with tf.Session(graph=tf.Graph()) as sess:
----> 2 tf.compat.v1.saved_model.loader.load(sess, ["serve"], "/home/tigerpaws/taxi/serving_model/taxi_simple/1553187887")#"/home/tigerpaws/saved_model_example/model")
3 graph=tf.get_default_graph()
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/util/deprecation.pyc in new_func(*args, **kwargs)
322 'in a future version' if date is None else ('after %s' % date),
323 instructions)
--> 324 return func(*args, **kwargs)
325 return tf_decorator.make_decorator(
326 func, new_func, 'deprecated',
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/saved_model/loader_impl.pyc in load(sess, tags, export_dir, import_scope, **saver_kwargs)
267 """
268 loader = SavedModelLoader(export_dir)
--> 269 return loader.load(sess, tags, import_scope, **saver_kwargs)
270
271
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/saved_model/loader_impl.pyc in load(self, sess, tags, import_scope, **saver_kwargs)
418 with sess.graph.as_default():
419 saver, _ = self.load_graph(sess.graph, tags, import_scope,
--> 420 **saver_kwargs)
421 self.restore_variables(sess, saver, import_scope)
422 self.run_init_ops(sess, tags, import_scope)
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/saved_model/loader_impl.pyc in load_graph(self, graph, tags, import_scope, **saver_kwargs)
348 with graph.as_default():
349 return tf_saver._import_meta_graph_with_return_elements( # pylint: disable=protected-access
--> 350 meta_graph_def, import_scope=import_scope, **saver_kwargs)
351
352 def restore_variables(self, sess, saver, import_scope=None):
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/training/saver.pyc in _import_meta_graph_with_return_elements(meta_graph_or_file, clear_devices, import_scope, return_elements, **kwargs)
1455 import_scope=import_scope,
1456 return_elements=return_elements,
-> 1457 **kwargs))
1458
1459 saver = _create_saver_from_imported_meta_graph(
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/meta_graph.pyc in import_scoped_meta_graph_with_return_elements(meta_graph_or_file, clear_devices, graph, import_scope, input_map, unbound_inputs_col_name, restore_collections_predicate, return_elements)
804 input_map=input_map,
805 producer_op_list=producer_op_list,
--> 806 return_elements=return_elements)
807
808 # Restores all the other collections.
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/util/deprecation.pyc in new_func(*args, **kwargs)
505 'in a future version' if date is None else ('after %s' % date),
506 instructions)
--> 507 return func(*args, **kwargs)
508
509 doc = _add_deprecated_arg_notice_to_docstring(
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/importer.pyc in import_graph_def(graph_def, input_map, return_elements, name, op_dict, producer_op_list)
397 if producer_op_list is not None:
398 # TODO(skyewm): make a copy of graph_def so we're not mutating the argument?
--> 399 _RemoveDefaultAttrs(op_dict, producer_op_list, graph_def)
400
401 graph = ops.get_default_graph()
/home/tigerpaws/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/importer.pyc in _RemoveDefaultAttrs(op_dict, producer_op_list, graph_def)
157 # Remove any default attr values that aren't in op_def.
158 if node.op in producer_op_dict:
--> 159 op_def = op_dict[node.op]
160 producer_op_def = producer_op_dict[node.op]
161 # We make a copy of node.attr to iterate through since we may modify
KeyError: u'BucketizeWithInputBoundaries'
Была также другая попытка, когда я попытался преобразовать SavedModel в GraphDef (замороженный график), чтобы я мог попробовать преобразователь еще раз. Преобразование потребуется output_node_names
который я не знаю; Также я не смог найти, где модель сохранена в коде (так что, возможно, я смогу где-нибудь определить имена выходных узлов).
Есть идеи по проблеме или альтернативные способы? Заранее спасибо.
Изменить: кто-нибудь может помочь создать теги? Я не набрал 1500 репутации, но этот вопрос действительно о tfx
/ tensorflow-extended
1 ответ
Извините за путаницу, вызванную; проблема на самом деле вызвана чтением файла SavedModel.
В SavedModel есть операция BucketizeWithInputBoundaries
это не определено в op_dict
,
Это все еще находится в списке Google TODO, прокомментированном в двух их сценариях.
Здесь и здесь. (Ссылки Github):
# TODO(jyzhao): BucketizeWithInputBoundaries error without this.
После импорта указанного скрипта эта проблема решена.
from tensorflow.contrib.boosted_trees.python.ops import quantile_ops # pylint: disable=unused-import