Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上运行Tensorflow模型_Android_Tensorflow_Bazel - Fatal编程技术网

在Android上运行Tensorflow模型

在Android上运行Tensorflow模型,android,tensorflow,bazel,Android,Tensorflow,Bazel,我正试图找出在Android上培训和部署Tensorflow模型的工作流程。我知道关于StackOverflow的其他问题与此类似,但它们似乎都没有解决我遇到的问题 在研究了Tensorflow存储库中的Android示例后,我认为工作流应该是这样的: 用Python建立和训练Tensorflow模型 创建一个新的图表,并将所有相关节点(即不是负责培训的节点)转移到此新图表。训练的权值变量是常量导入的,这样C++ API就可以读取它们。 在Java中开发Android GUI,使用native关

我正试图找出在Android上培训和部署Tensorflow模型的工作流程。我知道关于StackOverflow的其他问题与此类似,但它们似乎都没有解决我遇到的问题

在研究了Tensorflow存储库中的Android示例后,我认为工作流应该是这样的:

  • 用Python建立和训练Tensorflow模型
  • 创建一个新的图表,并将所有相关节点(即不是负责培训的节点)转移到此新图表。训练的权值变量是常量导入的,这样C++ API就可以读取它们。
  • 在Java中开发Android GUI,使用native关键字取消对Tensorflow模型的调用
  • 运行javah为Tensorflow本机调用生成C/C++存根代码
  • 使用TysFraseC++接口填写存根,并访问已训练/序列化的模型。
  • 使用Bazel构建Java应用程序和本机Tensorflow接口(作为.so文件),并生成APK
  • 使用adb部署APK

    第六步是问题所在。Bazel很乐意编译一个本机(到OSX).dylib,我可以通过JNI从Java调用它。同样,androidstudio将生成一大堆XML代码,以生成我想要的GUI。然而,Bazel希望所有java应用程序代码都位于“工作区”顶级目录(Tensorflow repo中),Android Studio立即从SDK链接到各种外部库以生成GUI(我知道,因为我的Bazel编译运行在找不到这些资源时会失败)。我能找到的迫使Bazel交叉编译.so文件的唯一方法是将其作为Android规则的从属规则。直接交叉编译本机库是我更愿意将我的a.S.代码移植到Bazel项目的地方

    我该如何处理这个问题?Bazel可能会编译Android代码,但Android Studio生成的代码是Bazel无法编译的。谷歌的所有例子都只是提供了回购协议的代码,而没有任何关于它是如何生成的线索。据我所知,作为Android Studio应用程序一部分的XML应该是生成的,而不是手工制作的。如果可以手工制作,我如何避免需要所有这些外部库

    也许我把工作流程搞错了,或者Bazel/Android Studio的某些方面我不太理解。谢谢你的帮助

  • 谢谢

    编辑:

    我最后做的几件事可能会对图书馆的建设做出成功的贡献:

  • 我升级到最新的Bazel
  • 我从源代码重建了TensorFlow
  • 我实现了下面推荐的Bazel构建文件,并添加了一些内容(摘自Android示例):


  • 我还没有验证这个库是否可以在Android中加载和使用;Android Studio 1.5似乎对确认本机LIB的存在非常挑剔。

    在您的工作区文件中设置Android NDK后,Bazel可以交叉编译。对于Android,如下所示:

    cc_binary(
        name = "libfoo.so",
        srcs = ["foo.cc"],
        deps = [":bar"],
        linkstatic = 1,
        linkshared = 1,
    )
    
    $ bazel build foo:libfoo.so \
        --crosstool_top=//external:android/crosstool --cpu=armeabi-v7a \
        --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
    $ file bazel-bin/foo/libfoo.so
    bazel-bin/foo/libfoo.so: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped
    
    Bazel希望所有java应用程序代码都在“工作区”中 顶层目录(在Tensorflow repo中)

    当0.1.4发布后(现在就推送它),我们已经推送了一些对TensorFlow和Protobuf的修复,您可以开始使用TensorFlow repo作为远程存储库。在工作区文件中进行设置后,可以使用
    @TensorFlow//foo/bar
    标签引用TensorFlow规则

    git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
    
    注意:--递归子模块对于拉取子模块很重要

    从这里安装Bazel。Bazel是TensorFlow的主要构建系统。 现在,编辑工作区,我们可以在前面克隆的TensorFlow的根目录中找到工作区文件

    # Uncomment and update the paths in these entries to build the Android demo.
    #android_sdk_repository(
    #    name = "androidsdk",
    #    api_level = 23,
    #    build_tools_version = "25.0.1",
    #    # Replace with path to Android SDK on your system
    #    path = "<PATH_TO_SDK>",
    #)
    #
    #android_ndk_repository(
    #    name="androidndk",
    #    path="<PATH_TO_NDK>",
    #    api_level=14)
    
    然后构建.so文件

    bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
       --crosstool_top=//external:android/crosstool \
       --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
       --cpu=armeabi-v7a
    
    用我们期望的目标体系结构替换armeabi-v7a。 图书馆将设在:

    bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so
    
    要构建Java对应项,请执行以下操作:

    bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
    
    我们可以在以下位置找到JAR文件:

    bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
    
    现在我们有了jar和.so文件。我已经构建了这两个.so文件和jar,您可以直接从中使用

    将libandroid_tensorflow_expression_java.jar放入libs文件夹,右键单击并添加为库

    compile files('libs/libandroid_tensorflow_inference_java.jar')
    
    在主目录中创建jniLibs文件夹,并将libtensorflow_.so放入jniLibs/armeabi-v7a/文件夹中

    现在,我们将能够调用TensorFlow Java API

    TensorFlowJavaAPI通过一个类TensorFlow推论接口公开了所有必需的方法

    现在,我们必须使用模型路径调用TensorFlow Java API并加载它


    我已经写了一个完整的博客。

    制作一个.dylib根本没有帮助,因为Android不是OSX-dylib是一种仅限OSX的格式。这是linux,您需要构建一个.so(这在功能方面几乎是一样的,但文件格式不同)。而且,Android中的XML都是手工生成的,而不是生成的。在谷歌的例子中几乎没有生成任何东西。事实上,你期望它是你的问题的一部分。此外,除非你的Tensorflow软件需要使用Bazel,否则我从未听说它被用于Android工作。Gradle是新标准,Ant是遗留标准。如果你使用的是Bazel,你要么是最前沿的,要么完全是在做你自己的事情。@amm你能在android上运行它吗?你构建的应用程序有多大?因为你很可能是该应用程序的成员,你可以在你的应用程序中记录它。如果我知道回答的人是开发团队的成员,我会更倾向于向上投票。我的意思是:我不能将我的应用程序代码保存在与Tensorflow根目录分离的目录结构中。这个解决方案不适合我。错误消息:“错误:未找到cpu‘darwin’的工具链。”我的工作区文件中定义了android_sdk_repository()和android_ndk_repository()。没错,它还不能工作。我应该在发帖前尝试一下说明,很抱歉。我更新了说明
    bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
    
    compile files('libs/libandroid_tensorflow_inference_java.jar')