2017-01-02 85 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; 
} 

但是當我運行它,我得到

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"]()]] 

我讀models/train.pbtxt有圖有14K線,所以這裏我不復制它。我會把相關部分:

................... 
node { 
    name: "input" 
    op: "Placeholder" 
    attr { 
    key: "_output_shapes" 
    value { 
     list { 
     shape { 
      dim { 
      size: -1 
      } 
      dim { 
      size: 46 
      } 
     } 
     } 
    } 
    } 
    attr { 
    key: "dtype" 
    value { 
     type: DT_FLOAT 
    } 
    } 
    attr { 
    key: "shape" 
    value { 
     shape { 
     } 
    } 
    } 
} 
node { 
    name: "output" 
    op: "Placeholder" 
    attr { 
    key: "_output_shapes" 
    value { 
     list { 
     shape { 
      dim { 
      size: -1 
      } 
     } 
     } 
    } 
    } 
    attr { 
    key: "dtype" 
    value { 
     type: DT_INT64 
    } 
    } 
    attr { 
    key: "shape" 
    value { 
     shape { 
     } 
    } 
    } 
} 
................... 

所以讀取的問題:這個錯誤信息告訴我什麼?

+1

它看起來像這張張流庫期待一個輸出變量傳遞給'Run'調用的輸出節點? – tinkertime

+0

也許,但如何?我看到的例子像這樣工作。這裏還有一個:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/public – matiasg

回答

1

在原始圖,有一個名爲"output"節點就是一個tf.placeholder(),即一個象徵性的張量必須爲fed當您運行依賴於它的任何操作。

在以下行中,它調用session->Run(),你告訴TensorFlow評估並取了一個名爲"output"節點的結果:

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

這似乎沒有任何意義:爲什麼取的值必須在同一條線上餵食的佔位符?

我懷疑名爲"output"節點實際上不對應於模型的輸出(例如預測),而是爲在預期的輸出饋送的佔位符(例如,用於饋送到"input"對應的值一個已知的標籤)。圖中可能有一些其他節點可以評估以獲得預測結果,但其名稱將取決於您最初如何構建圖形。

+0

謝謝!我找不到「真正的」輸出節點。我使用'fit'方法在python中用'tf.contrib.learn.DNNClassifier'實例生成它。在問題之後,我讀到應該凍結圖表,但我無法做到。我可以使用'freeze_graph'工具,但對於使用TF r0.11構建的圖形,但不能使用r0.12。 – matiasg

相關問題