Ошибка использования модели после использования optimize_for_inference.py на замороженном графике

Я использовал tensorflows scriptoptimize_for_inderence.py на ssd_mobilenet_v1_coco model с помощью следующей команды:

python -m tensorflow.python.tools.optimize_for_inference \
    --input /path/to/frozen_inference_graph.pb \
    --output /path/to/optimized_inference_graph.pb \
    --input_names=image_tensor \
    --output_names=detection_boxes,detection_scores,num_detections,detection_classes

Он работал без ошибок, но если я хочу использовать созданный Model .pb файл для Tensorboard или для Inference это дает мне следующую ошибку:

ValueError: graph_def недопустим на узле u'ToFloat': тензор ввода'image_tensor:0'Невозможно преобразовать тензор типа float32 для ввода типа uint8.

Смотрите оригинальный график, визуализированный Tensorbaord:

Как вы можете видеть узел ToFloat приходит сразу после image_tensor вход

Так что, очевидно, что-то пошло не так с оптимизацией. Но что?

1 ответ

Я видел похожую ошибку "Вход 0 узла ExpandDims_6 был передан с плавающей запятой из input_feed:0 несовместим с ожидаемым int64" при загрузке файла модели, созданного инструментом optimize_for_inference.

Комментарий Пита "новый подход преобразования графа для удаления неиспользуемых узлов может быть более надежным? https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/graph_transforms/" на https://github.com/tensorflow/tensorflow/issues/8242 похоже, предлагает нам использовать новый инструмент transform_graph.

В обновленной документации TensorFlow Mobile https://www.tensorflow.org/mobile также не упоминается инструмент optimize_for_inference, а также предлагается инструмент transform_graph.

Просто когда я сомневался, что виновник в инструменте оптимизации, я увидел ваш вопрос. Спасибо за это... Только что попробовал инструмент transform_graph, он работал, как с преобразованной моделью, так и с моделью memmapped после преобразования. Ниже приведены 3 команды freeze-transform-memmapped, которые я использовал:

python tensorflow/python/tools/freeze_graph.py  \
--input_meta_graph=/tmp/ckpt4.meta \
--input_checkpoint=/tmp/ckpt4 \
--output_graph=/tmp/ckpt4_frozen.pb \
--output_node_names="softmax,lstm/initial_state,lstm/state" \
--input_binary=true

bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--in_graph=/tmp/ckpt4_frozen.pb \
--out_graph=/tmp/ckpt4_frozen_transformed.pb \
--inputs="convert_image/Cast,input_feed,lstm/state_feed" \
--outputs="softmax,lstm/initial_state,lstm/state" \
--transforms='
      strip_unused_nodes(type=float, shape="1,299,299,3")
      fold_constants(ignore_errors=true) 
      fold_batch_norms
      fold_old_batch_norms'  


bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
--in_graph=/tmp/ckpt4_frozen_transformed.pb \
--out_graph=/tmp/ckpt4_frozen_transformed_memmapped.pb
Другие вопросы по тегам