gpt4 book ai didi

android - 如何在android中读取tensorflow内存映射图文件?

转载 作者:搜寻专家 更新时间:2023-11-01 08:27:19 25 4
gpt4 key购买 nike

使用Tensorflow 1.0.1可以在android中使用TensorFlowImageClassifier.create方法读取优化图和量化图,例如:

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

但根据 Peter Warden 的博客(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

它创建的很好,但是当我尝试使用 TensorFlowImageClassifier.create(...) 加载文件时,它说该文件不是有效的图形文件。

在iOS中,加载文件是可以的

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

因为它有一个读取内存映射图的方法。

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

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

最佳答案

由于来自memmapped工具的文件不再是标准的GraphDef protobuf,您需要对加载代码进行一些更改。您可以在 iOS Camera 演示应用程序 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);

您还需要使用指向您创建的环境的指针来创建 session :

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 Assets 的模型,因为它们是压缩的并且没有正常的文件名。相反,您需要将文件从 APK 复制到正常的文件系统位置。

完成这些步骤后,您可以正常使用 session 和图形,并且您应该会看到加载时间和内存使用量有所减少。

关于android - 如何在android中读取tensorflow内存映射图文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43533264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com