2017-04-21 70 views
2

使用Tensorflow 1.0.1它的优良读取优化的图表和在机器人使用TensorFlowImageClassifier.create方法量化的图表,如:如何在android中读取tensorflow内存映射图文件?

  classifier = TensorFlowImageClassifier.create(
        c.getAssets(), 
        MODEL_FILE, 
        LABEL_FILE, 
        IMAGE_SIZE, 
        IMAGE_MEAN, 
        IMAGE_STD, 
        INPUT_NAME, 
        OUTPUT_NAME); 

但根据彼得看守的博客(https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets/),它建议使用存储器在移动设备上映射图形以避免与内存相关的崩溃。

我建立

bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \ 
--in_graph=/tf_files/rounded_graph.pb \ 
--out_graph=/tf_files/mmapped_graph.pb 

memmapped图及其创建的罚款,但是当我试图加载与TensorFlowImageClassifier.create(...)的文件时,它说,文件是无效的图形文件。

在iOS中,它的确定将文件加载与

LoadMemoryMappedModel(
     model_file_name, model_file_type, &tf_session, &tf_memmapped_env); 

为它具有用于读取存储器映射图的方法。

所以,我猜在android中有类似的功能,但我找不到它。

有人可以指导我如何在android中加载内存映射图吗?

回答

3

由于memmapped工具中的文件不再是标准的GraphDef protobuf,因此您需要对加载代码进行一些更改。你可以看到这样的例子在iOS的相机演示应用程序,该LoadMemoryMappedModel()功能: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/ios_examples/camera/tensorflow_utils.mm#L159

相同的代码(用Objective C的呼吁让替代的文件名),可以在其他平台上使用过。因为我们使用内存映射,我们需要通过创建某个设定的文件有特殊TensorFlow环境对象开始,我们将使用:

std::unique_ptr<tensorflow::MemmappedEnv> memmapped_env; 
memmapped_env->reset(
     new tensorflow::MemmappedEnv(tensorflow::Env::Default())); 
    tensorflow::Status mmap_status = 
     (memmapped_env->get())->InitializeFromFile(file_path); 

然后,您需要在此环境下传递给后续调用,像这个加载图表一样。

tensorflow::GraphDef tensorflow_graph; 
tensorflow::Status load_graph_status = ReadBinaryProto(
    memmapped_env->get(), 
    tensorflow::MemmappedFileSystem::kMemmappedPackageDefaultGraphDef, 
    &tensorflow_graph); 

您还需要一个指向你所创建的环境中创建的会话:

tensorflow::SessionOptions options; 
options.config.mutable_graph_options() 
    ->mutable_optimizer_options() 
    ->set_opt_level(::tensorflow::OptimizerOptions::L0); 
options.env = memmapped_env->get(); 

tensorflow::Session* session_pointer = nullptr; 
tensorflow::Status session_status = 
    tensorflow::NewSession(options, &session_pointer); 

这里有一点要注意的是,我们也在一些禁用自动优化,因为这些情况会折叠不变的子树,因此创建我们不想要的张量值的副本并使用更多的RAM。此设置也意味着很难在Android中使用存储为APK资源的模型,因为这些模型是压缩的,并且没有正常的文件名。相反,您需要将您的文件从APK复制到正常的文件系统位置。

一旦你完成了这些步骤,你就可以像平常一样使用会话和图表,并且你会看到加载时间和内存使用量的减少。

+0

谢谢@Petewarden,我仍然对张量流内部结构知之甚少,但我想至少我现在有一个线索,现在从哪里开始。 –

+0

@JPKim嘿,我有同样的问题。我有内存映射图,但我无法从android端读取它。你是否能够使用内存映射图在Android端工作? –

+0

@BibinVelayudhan,我还没有解决问题,但我想分享我迄今为止发现的。 不知道为什么,但似乎android版本的原生库精简了,省略了memmapped文件的支持。 所以,概念是, 添加/修改JNI部分以支持memmapped env: 1)tensorflow/java/src/main/native/*。cc - >编辑tensor_jni.cc和graph_jni.cc以及其他几个可能?实现memmapped env。编辑TensorflowInferenceInterface.java –