Enregistrement TensorFlow dans / Chargement d'un graphique à partir d'un fichier

D'après ce que j'ai recueilli jusqu'à présent, il y a plusieurs façons différentes de décharger un graphique de TensorFlow dans un fichier et ensuite de le charger dans un autre programme, mais je n'ai pas été en mesure de trouver des exemples clairs/des informations sur la façon dont ils fonctionnent. Ce que je sais déjà c'est ceci:

  1. Enregistrer le modèle des variables dans un fichier de point de contrôle (.ckpt) en utilisant un tf.train.Saver() et les restaurer plus tard ( source )
  2. Enregistrer un modèle dans un .pb de fichier et la charge à l'aide de tf.train.write_graph() et tf.import_graph_def() ( source )
  3. charge dans un modèle de A.pb de fichier, de recycler, et la déverser dans une nouvelle .pb de fichier à l'aide avec les sections de bazel ( source )
  4. geler le graphe pour sauvegarder le graphe et les poids ensemble ( source )
  5. utiliser as_graph_def() pour sauvegarder le modèle, et pour les poids/variables, les mapper en constantes ( source )

cependant, je n'ai pas été en mesure de clarifier plusieurs questions concernant ces différentes méthodes:

  1. en ce qui concerne les fichiers des points de contrôle, ne sauvegardent-ils que les poids formés d'un modèle? Les fichiers de checkpoint peuvent-ils être chargés dans un nouveau programme, et être utilisés pour exécuter le modèle, ou servent-ils simplement à sauvegarder les poids dans un modèle à un moment ou à une étape donnés?
  2. concernant tf.train.write_graph() , les poids/variables sont-ils également sauvegardés?
  3. en ce qui concerne Bazel, peut-il seulement sauver dans/Charger à partir .fichiers pb pour le recyclage? Est-ce Qu'il y a une commande Bazel simple juste pour balancer un graphe dans un .le pb?
  4. en ce qui concerne la congélation, un graphe congelé peut-il être chargé en utilisant tf.import_graph_def() ?
  5. Le Android démo pour TensorFlow charges dans Google Création du modèle à partir d'une .pb de fichier. Si je voulais remplacer mon propre .pb de fichier, comment pourrais-je aller sur faire cela? Est-ce que je devrais changer un code/méthode natif?
  6. En général, quelle est exactement la différence entre toutes ces méthodes? Ou plus généralement, Quelle est la différence entre as_graph_def() /.CKPT./le pb?

en bref, ce que je cherche est une méthode pour enregistrer à la fois un graphique (comme dans, les diverses opérations et tel) et ses poids / variables dans un fichier, qui peut ensuite être utilisé pour charger le graphique et les poids dans un autre programme, pour utiliser (pas nécessairement continue/recyclage).

la Documentation sur ce sujet n'est pas très simple, donc toute réponse/information serait grandement appréciée.

74
demandé sur Community 2016-08-15 02:53:27

2 réponses

il y a plusieurs façons d'aborder le problème de sauver un modèle dans TensorFlow, ce qui peut le rendre un peu confus. Répondre à chacune de vos sous-questions à tour de rôle:

  1. les fichiers de points de contrôle (produits par exemple en appelant saver.save() sur un objet tf.train.Saver ) ne contiennent que les poids, et toute autre variable définie dans le même programme. Les utiliser dans un autre programme, vous devez recréer la structure du graphique associée (par exemple en exécutant le code pour le compiler à nouveau, ou en appelant tf.import_graph_def() ), ce qui indique à TensorFlow ce qu'il faut faire avec ces poids. Notez que l'appel saver.save() produit également un fichier contenant MetaGraphDef , qui contient un graphique et des détails sur la façon d'associer les poids d'un point de contrôle à ce graphique. Voir le tutoriel pour plus de détails.

  2. tf.train.write_graph() écrit seulement la structure du graphe; pas les poids.

  3. Bazel n'est pas lié à la lecture ou à l'écriture de graphiques TensorFlow. (Peut-être ai-je mal compris votre question: n'hésitez pas à la clarifier dans un commentaire.)

  4. un graphe congelé peut être chargé en utilisant tf.import_graph_def() . Dans ce cas, les poids sont (généralement) intégré dans le graphique, donc vous n'avez pas besoin de charger un checkpoint séparé.

  5. le changement principal serait de mettre à jour les noms du ou des tenseurs qui sont introduits dans le modèle, et les noms du ou des tenseurs qui sont extraits du modèle. Dans la démo Android de TensorFlow, cela correspondrait aux chaînes inputName et outputName qui sont passées à TensorFlowClassifier.initializeTensorFlow() .

  6. le GraphDef est la structure du programme, qui ne change généralement pas au cours du processus de formation. Le point de contrôle est un instantané de l'état d'un processus de formation, qui change généralement à chaque étape du processus de formation. En conséquence, TensorFlow utilise différents formats de stockage pour ces types de données, et L'API de bas niveau fournit différentes façons de les enregistrer et de les charger. Bibliothèques de niveau supérieur, telles que les MetaGraphDef bibliothèques, Keras , et skflow s'appuient sur ces mécanismes pour fournir des moyens plus pratiques de sauvegarder et de restaurer un modèle entier.

63
répondu mrry 2018-08-20 17:26:05

vous pouvez essayer le code suivant:

with tf.gfile.FastGFile('model/frozen_inference_graph.pb', "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    g_in = tf.import_graph_def(graph_def, name="")
sess = tf.Session(graph=g_in)
0
répondu Srihari Humbarwadi 2018-10-01 13:18:33