使用量化图时Android应用程序崩溃

时间:2016-11-03 09:35:40

标签: android tensorflow

我尝试在Android应用中使用量化图形,与描述here的方式相同。 使用的tensorflow版本是0.11.0rc0。

首先我运行了以下命令:

bazel-bin/tensorflow/python/tools/optimize_for_inference \
--input=/Users/nikogamulin/Desktop/assets/output_flowers.pb \
--output=/Users/nikogamulin/Desktop/assets/tensorflow_inception_graph_optimized.pb \
--input_names=Mul \
--output_names=final_result

bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/Users/nikogamulin/Desktop/assets/tensorflow_inception_graph_optimized.pb \
--output=/Users/nikogamulin/Desktop/assets/tensorflow_inception_graph_rounded.pb \
--output_node_names=final_result \
--mode=weights_rounded

bazel build //tensorflow/contrib/util:convert_graphdef_memmapped_format
bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
--in_graph=/Users/nikogamulin/Desktop/assets/tensorflow_inception_graph_rounded.pb \
--out_graph=/Users/nikogamulin/Desktop/assets/tensorflow_inception_graph_mapped.pb

output_flowers.pb是初始v3图表,除了我使用不同的数据集外,其重新训练方式与描述here相同。

在Android应用中尝试使用graph tensorflow_inception_graph_optimized.pb时,一切运行良好。然后,在切换到tensorflow_inception_graph_mapped.pb或tensorflow_inception_graph_rounded.pb之后,应用程序崩溃:一旦用户界面出现,对话框就会停止。不幸的是,TensorFlow演示已停止。"弹出。

以下是TensorFlowImageListener类的起始行:

  private static final int NUM_CLASSES = 23;
  private static final int INPUT_SIZE = 299;
  private static final int IMAGE_MEAN = 128;
  private static final float IMAGE_STD = 128;
  private static final String INPUT_NAME = "Mul:0";
  private static final String OUTPUT_NAME = "final_result:0";

  private static final String MODEL_FILE = "file:///android_asset/tensorflow_inception_graph_mapped.pb";
  private static final String LABEL_FILE = "file:///android_asset/labels_flowers.txt";
...

如果有人设法在Android中使用量化的初始v3图表或知道如何解决问题,我将非常感谢有关解决问题的任何建议。

1 个答案:

答案 0 :(得分:0)

我遇到了simmilar问题,我认为你的步骤的问题是内存映射部分。因为我认为这可能会输出节点名称或类似的内容。

如果你只是剥离你的模型(通过optimize_for_inference甚至更好地运行strip_unused)然后只是量化它,它将正确地使用初始v3模型 - 我刚试过它。

但是,我也想做mem映射部分,但我还没有管理它......

编辑:

最后,我在Peter Warden的博客上找到了工作解决方案:

bazel-bin/tensorflow/python/tools/optimize_for_inference \
--input=/tmp/output.pb \
--output=/tmp/optimized.pb \
--input_names=Mul \
--output_names=final_result

bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/tmp/optimized.pb \
--output=/tmp/rounded.pb \
--output_node_names=final_result \
--mode=weights_rounded

bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
--in_graph=/tmp/rounded.pb \
--out_graph=/tmp/mmapped.pb

(所有脚本必须在使用前使用bazel-bin命令提前构建)。

有了这个,我设法将我的v3再训练模型缩小到21 megs并在android项目中工作。欢呼声。