2017-10-01 1 views
0

J'ai chargé un modèle Tensorflow dans Go et je ne peux pas obtenir de prédictions - il continue de se plaindre de la non-concordance des formes - un simple tableau 2d. J'apprécierais une idée ici, merci beaucoup d'avance.Impossible de prédire le chargement d'un modèle Tensorflow dans Go

Error running the session with input, err: You must feed a value for placeholder tensor 'theoutput_target' with dtype float 
[[Node: theoutput_target = Placeholder[_output_shapes=[[?,?]], dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

tenseur d'entrée envoyé est un [] [] float32 {{1,0},}

a := [][]float32{ {1.0}, } 
tensor, terr := tf.NewTensor(a) 
if terr != nil { 
    fmt.Printf("Error creating input tensor: %s\n", terr.Error()) 
    return 
} 
result, runErr := model.Session.Run(
    map[tf.Output]*tf.Tensor{ 
     model.Graph.Operation("theinput").Output(0): tensor, 
    }, 
    []tf.Output{ 
     model.Graph.Operation("theoutput_target").Output(0), 
    }, 
    nil, 
) 

et le modèle est généré par l'intermédiaire d'Keras et exportés vers TF en utilisant SavedModelBuilder après:

layer_name_input = "theinput" 
layer_name_output = "theoutput" 

def get_encoder(): 
    model = Sequential() 
    model.add(Dense(5, input_dim=1)) 
    model.add(Activation("relu")) 
    model.add(Dense(5, input_dim=1)) 
    return model 

inputs = Input(shape=(1,), name=layer_name_input) 
encoder = get_encoder() 
model = encoder(inputs) 
model = Activation("relu")(model) 
objective = Dense(1, name=layer_name_output)(model) 
model = Model(inputs=[inputs], outputs=objective) 
model.compile(loss='mean_squared_error', optimizer='sgd') 

EDIT - corrigé, un problème est survenu lors de l'exportation de Keras vers TF (noms de calques). L'exportation ici coller, je l'espère utile pour quelqu'un d'autre:

def export_to_tf(keras_model_path, export_path, export_version, is_functional=False): 

    sess = tf.Session() 
    K.set_session(sess) 
    K.set_learning_phase(0) 

    export_path = os.path.join(export_path, str(export_version)) 

    model = load_model(keras_model_path) 
    config = model.get_config() 
    weights = model.get_weights() 
    if is_functional == True: 
     model = Model.from_config(config) 
    else: 
     model = Sequential.from_config(config) 
    model.set_weights(weights) 

    with K.get_session() as sess: 
     inputs = [ (model_input.name.split(":")[0], model_input) for model_input in model.inputs] 
     outputs = [ (model_output.name.split(":")[0], model_output) for model_output in model.outputs] 
     signature = predict_signature_def(inputs=dict(inputs), 
             outputs=dict(outputs)) 
     input_descriptor = [ { 'name': item[0], 'shape': item[1].shape.as_list() } for item in inputs] 
     output_descriptor = [ { 'name': item[0], 'shape': item[1].shape.as_list() } for item in outputs] 
     builder = saved_model_builder.SavedModelBuilder(export_path) 
     builder.add_meta_graph_and_variables(
      sess=sess, 
      tags=[tag_constants.SERVING], 
      signature_def_map={signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature}) 
     builder.save() 

     descriptor = dict() 
     descriptor["inputs"] = input_descriptor 
     descriptor["outputs"] = output_descriptor 
     pprint.pprint(descriptor)    
+0

C'est quelque chose d'étrange dans votre code et erreur. Tensorflow se plaint d'une valeur manquante pour l'espace réservé avec le nom 'theoutput_target', alors que cet espace réservé n'est jamais défini dans le code que vous avez posté. Au lieu de cela, votre code définit un espace réservé dont le nom est 'theinput'. – nessuno

+0

merci beaucoup, c'était un problème de nommage de calque (même si les calques sont correctement nommés dans Keras, ils finissent dans TF avec des noms différents - collé le nouveau code d'export ci-dessus (il suffit de lire le graphe m utilisant ces noms de Go après) – Adrian

+0

De rien, puisque j'ai résolu votre problème, je vais copier le commentaire et l'afficher comme réponse, n'hésitez pas à l'accepter – nessuno

Répondre

0

C'est quelque chose d'étrange dans votre code et erreur. Tensorflow se plaint d'une valeur manquante pour l'espace réservé avec le nom 'theoutput_target', alors que cet espace réservé n'est jamais défini dans le code que vous avez posté. Au lieu de cela, votre code définit un espace réservé dont le nom est 'theinput'.

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