web-dev-qa-db-fra.com

Tensorflow: comment convertir les fichiers de modèle .meta, .data et .index en un seul fichier graph.pb

Dans tensorflow, la formation à partir de zéro a produit les 6 fichiers suivants:

  1. events.out.tfevents.1503494436.06L7-BRM738 
  2. model.ckpt-22480.meta 
  3. point de contrôle 
  4. model.ckpt-22480.data-00000-of-00001 
  5. model.ckpt-22480.index 
  6. graph.pbtxt

Je voudrais les convertir (ou seulement ceux qui sont nécessaires) dans un fichier graph.pb pour pouvoir le transférer sur mon application Android.

J'ai essayé le script freeze_graph.py mais il nécessite déjà comme entrée le fichier input.pb que je n'ai pas. (Je n'ai que ces 6 fichiers mentionnés auparavant). Comment procéder pour obtenir ce fichier freezed_graph.pb file? J'ai vu plusieurs fils mais aucun ne fonctionnait pour moi.

14
Rafal

Vous pouvez utiliser ce script simple pour le faire. Mais vous devez spécifier les noms des noeuds de sortie.

import tensorflow as tf

meta_path = 'model.ckpt-22480.meta' # Your .meta file
output_node_names = ['output:0']    # Output nodes

with tf.Session() as sess:

    # Restore the graph
    saver = tf.train.import_meta_graph(meta_path)

    # Load weights
    saver.restore(sess,tf.train.latest_checkpoint('.'))

    # Freeze the graph
    frozen_graph_def = tf.graph_util.convert_variables_to_constants(
        sess,
        sess.graph_def,
        output_node_names)

    # Save the frozen graph
    with open('output_graph.pb', 'wb') as f:
      f.write(frozen_graph_def.SerializeToString())

Si vous ne connaissez pas le nom du ou des nœuds de sortie, il existe deux manières

  1. Vous pouvez explorer le graphique et trouver le nom avec Netron ou avec console summary_graph utility. 

  2. Vous pouvez utiliser tous les nœuds en sortie, comme indiqué ci-dessous.

output_node_names =[n.name for n in tf.get_default_graph().as_graph_def().node]

Mais je pense que la situation est inhabituelle, car si vous ne connaissez pas le nœud de sortie, vous ne pouvez pas utiliser le graphique.

19
velikodniy

Comme cela peut être utile pour les autres, je réponds également ici après la réponse à github ;-) .. Je pense que vous pouvez essayer quelque chose comme ceci (avec le script freeze_graph dans tensorflow/python/tools):

python freeze_graph.py --input_graph=/path/to/graph.pbtxt --input_checkpoint=/path/to/model.ckpt-22480 --input_binary=false --output_graph=/path/to/frozen_graph.pb --output_node_names="the nodes that you want to output e.g. InceptionV3/Predictions/Reshape_1 for Inception V3 "

L'indicateur important ici est --input_binary = false car le fichier graph.pbtxt est au format texte. Je pense que cela correspond au graph.pb requis, qui est l'équivalent au format binaire.

En ce qui concerne les noms de sortie (output_node_names), c’est très déroutant pour moi car j’ai encore quelques problèmes avec cette partie, mais vous pouvez utiliser le script resumeize_graph dans tensorflow qui peut prendre le pb ou le pbtxt en entrée.

Cordialement,

Steph

7
Steph

J'ai essayé le script freezed_graph.py, mais le paramètre output_node_name est totalement déroutant. Le travail a échoué. 

J'ai donc essayé l'autre: export_inference_graph.py. Et cela a fonctionné comme prévu!

python -u /tfPath/models/object_detection/export_inference_graph.py \
  --input_type=image_tensor \
  --pipeline_config_path=/your/config/path/ssd_mobilenet_v1_pets.config \
  --trained_checkpoint_prefix=/your/checkpoint/path/model.ckpt-50000 \
  --output_directory=/output/path

Le paquet d'installation de tensorflow que j'ai utilisé se trouve ici: https://github.com/tensorflow/models

2
kennyut

Commencez par utiliser le code suivant pour générer le fichier graph.pb . avec tf.Session () en tant que sess:

    # Restore the graph
    _ = tf.train.import_meta_graph(args.input)

    # save graph file
    g = sess.graph
    gdef = g.as_graph_def()
    tf.train.write_graph(gdef, ".", args.output, True)

puis, utilisez resume, obtenez le nom du noeud de sortie . Enfin, utilisez

python freeze_graph.py --input_graph=/path/to/graph.pbtxt --input_checkpoint=/path/to/model.ckpt-22480 --input_binary=false --output_graph=/path/to/frozen_graph.pb --output_node_names="the nodes that you want to output e.g. InceptionV3/Predictions/Reshape_1 for Inception V3 "

générer le graphe de gel.

0
lgz00gi