2017-01-02 16 views
0

私は、事前に訓練されたモデルを読み込んで使用するC++プログラムを構築しようとしています。私はコードfrom hereをとり、少し修正しました。 私が今持っていることは次のとおりです。なぜ "dtype int64でプレースホルダテンソルの出力に '値を入力する必要がありますか?

int main(int argc, char* argv[]) { 
    // Initialize a tensorflow session 
    Session* session; 
    Status status = NewSession(SessionOptions(), &session); 
    if (!status.ok()) { 
    std::cout << status.ToString() << "\n"; 
    return 1; 
    } 

    // Read in the protobuf graph we exported 
    GraphDef graph_def; 
    status = ReadTextProto(Env::Default(), "models/train.pbtxt", &graph_def); 
    if (!status.ok()) { 
    std::cout << status.ToString() << "\n"; 
    return 1; 
    } 

    // Add the graph to the session 
    status = session->Create(graph_def); 
    if (!status.ok()) { 
    std::cout << status.ToString() << "\n"; 
    return 1; 
    } 

    tensorflow::Tensor inputs(DT_FLOAT, TensorShape({46})); 
    auto inputs_flat = inputs.flat<float>(); 
    inputs_flat.setRandom(); 

    // The session will initialize the outputs 
    std::vector<tensorflow::Tensor> outputs; 

    status = session->Run({{"input", inputs}}, {"output"}, {}, &outputs); 
    if (!status.ok()) { 
    std::cout << status.ToString() << "\n"; // <--- error shows here 
    return 1; 
    } 

    // Grab the first output 
    // and convert the node to a scalar representation. 
    auto output_c = outputs[0].scalar<int>(); 

    // Print the results 
    std::cout << outputs[0].DebugString() << "\n"; 
    std::cout << output_c() << "\n"; 

    // Free any resources used by the session 
    session->Close(); 
    return 0; 
} 

しかし、私はそれを実行したとき、私は私がmodels/train.pbtxtで読んでいるグラフは、14Kラインを持っているので、私はここでそれをコピーしていないです

Invalid argument: You must feed a value for placeholder tensor 'output' with dtype int64 
    [[Node: output = Placeholder[_output_shapes=[[-1]], dtype=DT_INT64, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

を取得します。

このようなエラーメッセージはどういう意味ですか?

+1

このテンソルフローライブラリは、出力変数が 'Run'呼び出しの出力ノードに渡されることを期待していますか? – tinkertime

+0

たぶん、どうですか?私が見た例はこのようなものです。ここに別のものがあります:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/public – matiasg

答えて

1

というノードがあり、それに依存する操作を実行するときにはfedでなければならないシンボリックテンソルがあります。このノードはtf.placeholder()です。

あなたが "output"という名前のノードの結果を評価し、フェッチするTensorFlowを言っている session->Run()を呼び出して次の行では、

、:

status = session->Run({{"input", inputs}}, {"output"}, {}, &outputs); 

これが意味をなすようには見えません。理由の値を取得同じ行に入力する必要があるプレースホルダ?

私は"input"に供給され、対応する値の例が知らラベル("output"という名前のノードが実際にあなたのモデルの出力(例えば予測)に対応していないと思われるのではなく、予想される出力に供給するためのプレースホルダです)。グラフには、おそらく予測を得るために評価できる他のノードがありますが、その名前は最初にグラフを作成した方法によって異なります。

+0

ありがとう!私は "本当の"出力ノードを見つけることができませんでした。私は 'fit'メソッドを使って' tf.contrib.learn.DNNClassifier'のインスタンスを使ってPythonで生成しました。質問の後、私はグラフをフリーズするべきだと読んだが、私はそれをすることができなかった。私は 'freeze_graph'ツールではできますが、TF r0.11で作成されたグラフではr0.12では作成できませんでした。 – matiasg

関連する問題

 関連する問題