2017-01-17 44 views
2

tensorflow.soc_api.hのグラフをC++に読み込む方法の例はありません。私はc_api.hを読みましたが、ReadBinaryProto関数はそれに含まれていませんでした。 ReadBinaryProto機能を持たないグラフをロードするにはどうすればよいですか?tensorflow.soとc_api.hを使ってグラフをC++言語で読み込む方法は?

+0

ネイティブC++ [ライブラリ](https://www.tensorflow.org/api_docs/cc/namespace/tensorflow#readbinaryproto)の代わりにC++でC APIを使用しようとしているのはなぜですか? –

+0

実際、テンソルフローの外側にグラフを読み込むためにtensorflowのC++ apiを使用したいと思っています –

答えて

6

C++を使用している場合は、代わりにC++ APIを使用できます。 label image exampleは、おそらくあなたが始めるのに役立つ良いサンプルです。

実際にC APIだけを使用する場合は、TF_GraphImportGraphDefを使用してグラフを読み込みます。

#include <stdio.h>                   
#include <stdlib.h>                  
#include <tensorflow/c/c_api.h>               

TF_Buffer* read_file(const char* file);             

void free_buffer(void* data, size_t length) {            
     free(data);                  
}                       

int main() {                    
    // Graph definition from unzipped https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip 
    // which is used in the Go, Java and Android examples         
    TF_Buffer* graph_def = read_file("tensorflow_inception_graph.pb");      
    TF_Graph* graph = TF_NewGraph(); 

    // Import graph_def into graph               
    TF_Status* status = TF_NewStatus();              
    TF_ImportGraphDefOptions* opts = TF_NewImportGraphDefOptions();       
    TF_GraphImportGraphDef(graph, graph_def, opts, status); 
    TF_DeleteImportGraphDefOptions(opts); 
    if (TF_GetCode(status) != TF_OK) { 
      fprintf(stderr, "ERROR: Unable to import graph %s", TF_Message(status));   
      return 1; 
    }  
    fprintf(stdout, "Successfully imported graph");           
    TF_DeleteStatus(status); 
    TF_DeleteBuffer(graph_def);                

    // Use the graph                   
    TF_DeleteGraph(graph);                 
    return 0; 
} 

TF_Buffer* read_file(const char* file) {             
    FILE *f = fopen(file, "rb"); 
    fseek(f, 0, SEEK_END); 
    long fsize = ftell(f);                 
    fseek(f, 0, SEEK_SET); //same as rewind(f);            

    void* data = malloc(fsize);                
    fread(data, fsize, 1, f); 
    fclose(f); 

    TF_Buffer* buf = TF_NewBuffer();               
    buf->data = data; 
    buf->length = fsize;                  
    buf->data_deallocator = free_buffer;              
    return buf; 
} 
+1

ありがとうございます。私はtensorflowプロジェクトの外でC++ APIを使いたいです。 「ラベルイメージの例」は、テンソルフロープロジェクト内に構築されています。テンソルフローの外側でC++ APIを使用するにはどうすればよいですか?ヘッダーファイルはどうしたらいいですか? –

0

前の答えはあなたのメインである:CのAPIは、例えば(このような移動、ジャワ、錆、ハスケルなどなど、他の言語でバインディングを構築することを意図している)を使用することが特に便利ではないことに注意してくださいあなたがTensorFlowプロジェクトの外でそれを使用したい(そしてその結果としてBazelでビルドしたくない)場合は、オプションです。 にはが必要です。TF_GraphImportDefを使ってc_api.hからロードするには、Pythonでテストを行い、終了したらモデル/グラフをC++/C Apiでエクスポートすることをお勧めします。

関連する問題