2017-04-20 77 views
4

我使用定製模型進行張量流相機演示中的分類。 我生成了一個.bp文件,我可以顯示它包含的巨大圖形。 向該圖表轉換爲優化的曲線圖,如在[https://www.oreilly.com/learning/tensorflow-on-android]給出,以下過程可用於:給出張量流模型圖,如何找到輸入節點和輸出節點名稱

$ bazel-bin/tensorflow/python/tools/optimize_for_inference \ 
--input=tf_files/retrained_graph.pb \ 
--output=tensorflow/examples/android/assets/retrained_graph.pb 
--input_names=Mul \ 
--output_names=final_result 

這裏如何找到從圖形顯示的input_names和output_names。 當我不使用專有名詞,我得到設備崩潰:

E/TensorFlowInferenceInterface(16821): Failed to run TensorFlow inference 
with inputs:[AvgPool], outputs:[predictions] 

E/AndroidRuntime(16821): FATAL EXCEPTION: inference 

E/AndroidRuntime(16821): java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048] 

E/AndroidRuntime(16821):  [[Node: dropout/dropout/mul = Mul[T=DT_FLOAT, 
_device="/job:localhost/replica:0/task:0/cpu:0"](dropout/dropout/div, 
dropout/dropout/Floor)]] 
+0

Hi @ Dr.SantleCamilus,您是否有解決方案? –

+1

是的,提及正確的輸入和輸出節點名稱是android TF演示工作的基礎,一些較早的TF訓練代碼可能不會在模型中包含這些名稱。如果沒有名字,需要遷移到新的TF訓練代碼以包含正確的節點名稱 –

+0

我得到這樣的輸出* [u'image_tensor => Placeholder' ] * –

回答

5

試試這個:

執行python

>>> import tensorflow as tf 
>>> gf = tf.GraphDef() 
>>> gf.ParseFromString(open('/your/path/to/graphname.pb','rb').read()) 

然後

>>> [n.name + '=>' + n.op for n in gf.node if n.op in ('Softmax','Placeholder')] 

然後,你可以得到結果與此類似:

['Mul=>Placeholder', 'final_result=>Softmax'] 

但我不確定這是關於錯誤消息的節點名稱的問題。 我猜你在加載圖形文件或生成的圖形文件出錯時提供了錯誤的論據?

檢查這一部分:

E/AndroidRuntime(16821): java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048] 

UPDATE: 對不起, 如果你使用(再)培訓的圖,那就試試這個:

[n.name + '=>' + n.op for n in gf.node if n.op in ('Softmax','Mul')] 

看來,(重)訓練圖將輸入/輸出op名稱保存爲「Mul」和「Softmax」,而優化和/或量化圖將其保存爲「佔位符」和「Softmax」。

順便說一句,根據彼得Warden的職位:https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets/不推薦使用移動環境中的再培訓圖。由於性能和文件大小問題,最好使用量化或memmapped圖形,但我無法找到如何在android中加載memmapped圖形,但... :( (在Android中加載優化/量化圖形時沒有問題)

+1

當我執行自定義模型的註釋:[n.name +'=>'+ n.op for n inin_graph_def.node if n.op in('Softmax','Placeholder')],我得到 [ u'tower_0/logits/predictions => Softmax'],顯示輸出圖層名稱,而輸入圖層名稱不存在。我無法理解事情出錯的地方。 –

+0

@ Dr.SantleCamilus查看我的更新 –

+0

@ Dr.SantleCamilus,我認爲加載圖形文件時出現錯誤的原因是您嘗試加載未針對移動設備進行優化的圖表。你不應該使用重新輸出的pb文件。它在移動設備上存在Djpeg問題。 所以,只需使用optimized_for_inference和/或quantize_graph將其轉換即可。兩者都很好,但量化圖更好。 –

相關問題