2017-04-21 58 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 –