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