讀取並解讀模型輸出
| 欄位 | 值 |
|---|---|
| 類別 | 模型與推論 |
| 難度 | 中級 |
| 預估閱讀時間 | 10-15 minutes |
| 標籤 | output, patterns, sink |
在您最佳化吞吐量或新增複雜圖邏輯之前,您需要一種穩定且可靠的方法來讀取執行階段傳回的任何內容。輸出始終是一個 Sample,但其形狀會有所不同:它可能是一個單一的張量,或者是一組帶有名稱的欄位(如第 009 章所述)。嘗試從一組欄位中獲取 .tensor,或者假設不存在的形狀,這就是本章要教您避免的錯誤。
我們建置與之前相同的最小同步圖,執行一個框架,然後有系統地檢查結果:其 kind,是否存在張量,有多少個欄位,以及張量的秩。到最後,您將擁有一個可重複使用的輸出讀取模式,適用於執行階段服務的任何模型。
操作指南
設定輸入
宣告輸入合約——像素 format、width、height、depth——與我們將推送的框架匹配。這是整個章節中使用的相同邊界合約。
tutorials/011_interpret_model_output/interpret_model_output.cpp
simaai::neat::InputOptions in;
in.format = "RGB";
in.width = rgb.cols;
in.height = rgb.rows;
in.depth = rgb.channels();
組合並建置圖
將輸入節點連接到輸出節點,並 build() 成一個同步 Run,傳遞框架,以便 build() 可以協商具體的形狀。由於中間沒有模型,因此輸出反映了輸入——這正是使其成為研究輸出結構的理想場所的原因。
tutorials/011_interpret_model_output/interpret_model_output.cpp
simaai::neat::Graph graph;
graph.add(simaai::neat::nodes::Input(in));
graph.add(simaai::neat::nodes::Output());
// Use Graph::run(...) for a one-shot synchronous frame.