Dans tensorflow, la formation à partir de zéro a produit les 6 fichiers suivants:
- events.out.tfevents.1503494436.06L7-BRM738
- model.ckpt-22480.meta
- point de contrôle
- model.ckpt-22480.data-00000-of-00001
- model.ckpt-22480.index
- 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.
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
Vous pouvez explorer le graphique et trouver le nom avec Netron ou avec console summary_graph utility.
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.
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
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
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.