2017-09-15 273 views
1

我試圖優化一個保存的推斷圖,所以我可以在Android中使用它。TensorFlow:優化推理Estimator導出的SavedModel

我在使用optimize_for_inference腳本首先嚐試與

google.protobuf.message.DecodeError: Truncated message 

失敗所以我的問題是輸入/輸出節點是錯誤的或者腳本不能處理SavedModels(雖然它是相同的延伸凍結圖。 pb)

關於第一個問題:由於使用Estimators,我們提供input_fn而不是數據本身,應該將其視爲輸入?第一個tf操作呢?像:

x = x_dict['gestures'] 

# Data input is a 1-D vector of x_dim * y_dim features ("pixels") 
# Reshape to match format [Height x Width x Channel] 
# Tensor input become 4-D: [Batch Size, Height, Width, Channel] 
x = tf.reshape(x, shape=[-1, x_dim, y_dim, 1], name='input') 

(...) 

pred_probs = tf.nn.softmax(logits, name='output') 

BTW:如果有東西在Android中加載SavedModel不同,我想太瞭解。

預先感謝您!

回答

0

它們都是協議緩衝區(.pb),但不幸的是它們是不同的消息(即不同的文件格式)。理論上,您可以先從SavedModel中提取MetaGraph,然後「凍結」MetaGraph的GraphDef(將變量移動到常量中),然後在凍結的GraphDef上運行此腳本。在這種情況下,你會希望你的input_fn只是佔位符。

您還可以在"SavedModel support for Android" Github issues之一上添加一個表情符號。中期我們想標準化SavedModel;對不起,你遇到過這個!

+0

感謝您的回覆。在問題中增加了+1,因爲如果您要推薦使用SavedModel,這真的是必不可少的。 關於輸入/輸出節點的命名:我的input_fn是使用tf.estimator.inputs.numpy_input_fn構建的,以填充特徵字典和標籤。這裏沒有實際的節點(也沒有辦法命名可能的底層佔位符?),所以我嘗試使用x上的第一個TF操作作爲輸入(參見問題)。暫時更改爲「原始」TF(發行中的其他問題),但真的很享受Estimator API以及所有來自(或應該)使用它的內容。 – AVCarreiro

+0

預期的策略是有一個用於訓練的input_fn(例如,您的numpy_input_fn),然後在導出保存的模型時使用input_receiver_fn,它可以[明確接受提要](https://www.tensorflow.org/api_docs/python/tf/estimator/export/build_raw_serving_input_receiver_fn)(這聽起來像你之後的)或[解析tf.Example消息](https://www.tensorflow.org/api_docs/python/tf/estimator/export/build_parsing_serving_input_receiver_fn)。這樣你就不需要擺弄訓練input_fn也可以用於服務。 –

+0

是的,爲了保存模型,我使用了tf.estimator.export.build_raw_serving_input_receiver_fn(feature_spec),其中feature_spec將tf.placeholder(dtype = tf.float32,shape = [None,total_dimension])映射到訓練input_fn中使用的相同鍵。我的問題是有關optimize_for_inference的方法,這些方法總是需要輸入和輸出節點的名稱,使用Estimator API(input_fn和model_fn)構建網絡時我不清楚。無論如何感謝您的意見 – AVCarreiro

相關問題