使用Bazel构建Android后隐藏TensorFlow错误

时间:2017-09-20 20:37:30

标签: android gradle tensorflow bazel

我试图基于TensorFlow Android演示构建一个简单的Android应用程序;但是我使用的模型需要默认情况下不包含TensorFlow aar的内核Op。这使我走上了从源代码编译库的道路。

我已经通过gradle使用bazel作为本机构建工具来构建apk;但是,每当我尝试从.pb文件(实际上是protobuff格式的任何模型)加载模型时,应用程序崩溃时会出现一个错误,声称模型是"不是有效的TensorFlow图形序列化:无效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设置),并包含额外的必需内核Op。

我尝试过的事情:

  • 经过一番研究,我在TensorFlowSharp github页面上发现了一个问题,表明这种崩溃可能是缓冲区大小的问题,而且我的模型相当大(~93MB)。但是,如果网络小得多(1.6MB),我会得到同样的错误。

  • 我也尝试关闭.pb文件的压缩作为gradle构建的一部分,因为在某处也是如此,也没有改变。

  • 在绝望的尝试中,我尝试用JCenter中提供的Tensorflow android aar中的现有.so文件替换我刚刚构建的文件,但这会导致相同的错误。

  • 离线编译.so个文件并手动将它们放在相应的android项目目录中。

1 个答案:

答案 0 :(得分:0)

事实证明这是我正在处理的TensorFlow提交的一个问题。当我合并上游TensorFlow仓库的最新变化时,错误就消失了。

我无法想象其他人会遇到这个问题;但如果你这样做,或者你遇到了一些类似的模糊错误,更新到更新版本的TensorFlow可能是你的解决方案。或者,你可以选择比我更聪明,并建立一个稳定版本的库。