【发布时间】:2017-09-20 20:37:30
【问题描述】:
我正在尝试基于 TensorFlow Android 演示构建一个简单的 Android 应用;但是我使用的模型需要一个内核 Op,默认情况下不包含在 TensorFlow aar 中。这使我走上了从源代码编译库的道路。
我已经获得了通过 gradle 构建的 apk,使用 bazel 作为本机构建工具;但是,每当我尝试从 .pb 文件(实际上是任何 protobuff 格式的模型)加载模型时,应用程序就会崩溃,并出现一个错误,声称模型是“不是有效的 TensorFlow Graph 序列化:无效的 GraphDef”。
有人遇到过这个问题吗?我猜有些东西没有正确编译,但我什至不确定从哪里开始寻找错误。
这是我正在使用的 Bazel 构建命令(为方便起见,在多行上,几乎逐字从演示中提取):
/usr/local/bin/bazel build -c opt
tensorflow/examples/android/app:tensorflow_native_libs
--crosstool_top=//external:android/crosstool --cpu=arm64-v8a
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain
注意:build.gradle 文件和 Bazel BUILD 文件基本上保持不变;我更改了一些路径(我将 android 示例移动到子目录 app/,以允许多项目 gradle 设置),并包含了额外的所需内核操作。
我尝试过的事情:
经过一些研究,我在 TensorFlowSharp github 页面上发现了一个问题,表明此崩溃可能是缓冲区大小的问题,而且我的模型相当大(~93MB)。然而,对于一个小得多的网络(1.6MB),我得到了同样的错误。
我还尝试在 gradle 构建过程中关闭
.pb文件的压缩,因为这也是在某个地方推荐的,也没有任何更改。-
在绝望的尝试中,我尝试将 JCenter 提供的 Tensorflow android aar 中现有的
李>.so文件替换为我刚刚构建的文件,但这会导致同样的错误。 离线编译
.so文件并手动将它们放置在相应的android项目目录中。
【问题讨论】:
标签: android gradle tensorflow bazel