2017-09-23 8 views
0

code Python du modèle de train:Comment nourrir chaîne d'entrée avec la forme = à tensorflow modèle en utilisant golang

input_schema = dataset_schema.from_feature_spec({ 
    REVIEW_COLUMN: tf.FixedLenFeature(shape=[], dtype=tf.string), 
    LABEL_COLUMN: tf.FixedLenFeature(shape=[], dtype=tf.int64) 
}) 

Dans les prévisions de python fonctionnent très bien. Exemple de client:

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) 

Mais client golang ne fonctionne pas:

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)) 
} 

Je suis erreur:

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"]]

Comment puis-je présenter shape=[?] tenseur avec golang? Ou j'ai besoin de changer le format d'entrée du script de formation python?

UPD:

Cette chaîne "save_1/StringJoin/inputs_1" j'ai reçu après l'exécution de ce python-code:

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

Sortie:

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

Êtes-vous sûr que 'save_1/StringJoin/inputs_1' est le même vaue de 'input_dict [" entrées "]'? – nessuno

+0

J'ai mis à jour le sujet avec des informations sur "save_1/StringJoin/inputs_1". J'ai essayé d'autres touches, mais le résultat était le même - erreur. –

+0

Pouvez-vous montrer la sortie de 'print (input_dict [" entrées "])'? – nessuno

Répondre

0

L'erreur vous dit You must feed a value for placeholder tensor 'Placeholder': cela signifie que le graphique peut ne sera pas construit jusqu'à ce que vous nourrissiez une valeur pour cet espace réservé.

Dans votre code python, votre flux au moment de la ligne:

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

En fait, input_dict["inputs"] est évalué à: <tf.Tensor 'Placeholder:0' shape=(?,) dtype=string>.

Dans votre code Go, vous recherchez plutôt un tenseur nommé save_1/StringJoin/inputs_1 qui n'est pas l'espace réservé.

La règle à suivre est la suivante: utilisez la même entrée à la fois dans Python & Go.

Pour résoudre le problème, il suffit donc d'extraire du graphique l'espace réservé nommé Placeholder (comme dans python) et de l'utiliser ensuite.

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

Aussi, je vous suggère d'utiliser un emballage plus complet et facile à utiliser autour de l'API tensorflow: tfgo

0

une chose. J'ai lu TF docs et trouvé ce topic

Il aide à trouver les clés d'entrée/sortie correcte, exemple de réponse:

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

PS/Posté comme réponse pour se concentrer