2017-09-23 63 views
0
系模型的

Python代碼tensorflow模型。客戶端的例子:如何喂輸入串與形狀=使用golang

loaded_model = tf.saved_model.loader.load(sess, ["serve"], '/tmp/model/export/Servo/1506084916') 
input_dict, output_dict =_signature_def_to_tensors(loaded_model.signature_def['default_input_alternative:None']) 
start = datetime.datetime.now() 
out = sess.run(output_dict, feed_dict={input_dict["inputs"]: ("I went and saw this movie last night",)}) 
print(out) 
print("Time all: ", datetime.datetime.now() - start) 

但golang客戶端無法正常工作:

m, err := tf.LoadSavedModel("/tmp/model/export/Servo/1506084916", []string{"serve"}, &tf.SessionOptions{}) 
if err != nil { 
    panic(fmt.Errorf("load model: %s", err)) 
} 

data := "I went and saw this movie last night" 
t, err := tf.NewTensor([]string{data}) 
if err != nil { 
    panic(fmt.Errorf("tensor err: %s", err)) 
} 
fmt.Printf("tensor: %v", t.Shape()) 

output, err = m.Session.Run(
    map[tf.Output]*tf.Tensor{ 
     m.Graph.Operation("save_1/StringJoin/inputs_1").Output(0): t, 
    }, []tf.Output{ 
     m.Graph.Operation("linear/binary_logistic_head/predictions/classes").Output(0), 
    }, nil, 
) 
if err != nil { 
    panic(fmt.Errorf("run model: %s", err)) 
} 

我得到了錯誤:

panic: run model: You must feed a value for placeholder tensor 'Placeholder' with dtype string and shape [?] [[Node: Placeholder = Placeholder_output_shapes=[[?]], dtype=DT_STRING, shape=[?], _device="/job:localhost/replica:0/task:0/cpu:0"]]

我怎樣才能呈現shape=[?]張量golang?或者我需要改變python訓練腳本的輸入格式?

UPD:

此字符串"save_1/StringJoin/inputs_1"我跑這條巨蟒代碼後收到:

for n in sess.graph.as_graph_def().node: 
    if "inputs" in n.name: 
     print(n.name) 

輸出:

transform/transform/inputs/review/Placeholder 
transform/transform/inputs/review/Identity 
transform/transform/inputs/label/Placeholder 
transform/transform/inputs/label/Identity 
transform/transform_1/inputs/review/Placeholder 
transform/transform_1/inputs/review/Identity 
transform/transform_1/inputs/label/Placeholder 
transform/transform_1/inputs/label/Identity 
save_1/StringJoin/inputs_1 
save_2/StringJoin/inputs_1 
+0

你肯定'save_1/StringJoin/inputs_1'與'input_dict [「inputs」]''是相同的嗎? – nessuno

+0

我更新了有關「save_1/StringJoin/inputs_1」的信息。我嘗試了其他鍵,但結果相同 - 錯誤。 –

+0

你可以顯示'print(input_dict [「inputs」])''的輸出嗎? – nessuno

回答

0

的這個錯誤告訴你You must feed a value for placeholder tensor 'Placeholder':這意味着圖可以直到您爲該佔位符提供了一個值之後才能建立。

在Python代碼,您的飼料它在該行:

input_dict["inputs"]: ("I went and saw this movie last night",) 

事實上,input_dict["inputs"]被評估爲:<tf.Tensor 'Placeholder:0' shape=(?,) dtype=string>

在您的Go代碼中,您正在尋找名爲save_1/StringJoin/inputs_1的張量,這不是佔位符。

遵循的規則是:在Python & Go中使用相同的輸入。

爲了解決這個問題,因此,你只需要從圖中提取名爲Placeholder的佔位符(就像在Python中),然後使用它。

m.Graph.Operation("Placeholder").Output(0): t, 

另外,我建議你周圍使用tensorflow API更完整和更容易使用的包裝:tfgo

0

一兩件事。我讀TF文檔,發現這個topic

它有助於找到正確的輸入/輸出鍵,例如響應:

The given SavedModel SignatureDef contains the following input(s): inputs['inputs'] tensor_info: 
    dtype: DT_STRING 
    shape: (-1) 
    name: Placeholder:0 

PS /發佈的答案聚焦