2016-07-06 60 views
0

我有一個Tensorflow模型在Python中訓練並且使用freeze_graph腳本進行凍結。我已經用C++成功加載了模型,並對單個圖像進行了推理。但是,似乎freeze_graph一次只將批量設置爲單個圖像,因爲我無法將模型張量傳遞給多個圖像。當使用Tensorflows時,使用大於1的批處理大小C++ API

有沒有人知道改變這種方式?我一直無法找到腳本實際發生的位置。

謝謝!

編輯:

好了,所以我報廢Keras只是爲了消除任何黑色魔力,可能會做的,我定義與Tensorflow網絡時設置16的批量大小。

如果我DEF打印圖形,佔位符的形狀:

node { 
    name: "inputs" 
    op: "Placeholder" 
    attr { 
    key: "dtype" 
    value { 
     type: DT_FLOAT 
    } 
    } 
    attr { 
    key: "shape" 
    value { 
     shape { 
     dim { 
      size: 16 
     } 
     dim { 
      size: 50 
     } 
     dim { 
      size: 50 
     } 
     dim { 
      size: 3 
     } 
     } 
    } 
    } 
} 

然而,當我試圖加載並與形狀16×50×50×3的張量運行在C++模型,我得到這個錯誤:

tensorflow/core/framework/tensor.cc:433] Check failed: 1 == NumElements() (1 vs. 16)Must have a one element tensor 

當我凍結圖表時,某處必須發生什麼?

+0

'freeze_graph'不會'設置'模型的批量大小。您如何在原始模型中輸入輸入信息? – keveman

+0

我已經使用Keras構建了模型,我相信它使用默認的可變批量。這讓我假設'freeze_graph'必須在尺寸可變的佔位符的情況下做一些事情,但我可能是錯的。有沒有一種方法可以檢查佔位符的形狀實際上是什麼? – ppries

+0

您可以嘗試使用'graph.as_graph_def()'以文本形式打印圖形,並查看佔位符是否設置了形狀屬性。 – keveman

回答

0

原來,這是我的一個愚蠢的錯誤。當獲得圖表的輸出時,我在它上面調用了.scalar<float>()。當我只有一個輸入圖像,因此只有一個輸出,但是顯然我不能將一個矢量轉換爲標量時,這種工作非常好。將其更改爲.flat<float>()解決了我的問題。

相關問題