python transformgraph - TensorFlow sauvegarde dans / charger un graphique à partir d'un fichier




inference freeze (2)

Il existe plusieurs façons d'aborder le problème de l'enregistrement d'un modèle dans TensorFlow, ce qui peut le rendre un peu confus. Prendre successivement chacune de vos sous-questions:

  1. Les fichiers de point de contrôle (créés par exemple en appelant saver.save() sur un objet tf.train.Saver ) contiennent uniquement les poids et toutes les autres variables définies dans le même programme. Pour les utiliser dans un autre programme, vous devez recréer la structure de graphe associée (par exemple en exécutant du code pour le reconstruire ou en appelant tf.import_graph_def() ), ce qui indique à TensorFlow ce qu'il faut faire avec ces poids. Notez que l'appel de saver.save() produit également un fichier contenant un tensorflow.org/versions/r0.10/how_tos/meta_graph/index.html , qui contient un graphique et des détails sur la façon d'associer les poids d'un point de contrôle à ce graphe. Voir tensorflow.org/versions/r0.10/how_tos/meta_graph/index.html pour plus de détails.

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

  3. Bazel n'a aucun rapport avec 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 graphique gelé peut être chargé en utilisant tf.import_graph_def() . Dans ce cas, les poids sont (généralement) intégrés dans le graphique, vous n'avez donc pas besoin de charger un point de contrôle séparé.

  5. La principale modification consiste à mettre à jour les noms des tenseur (s) introduits dans le modèle et les noms des tenseur (s) extraits du modèle. Dans la démo Android TensorFlow, cela correspondrait aux inputName et outputName transmises à 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. Par conséquent, TensorFlow utilise différents formats de stockage pour ces types de données et l'API de bas niveau fournit différentes manières de les enregistrer et de les charger. Les bibliothèques de niveau supérieur, telles que les bibliothèques tensorflow.org/versions/r0.10/how_tos/meta_graph/index.html , Keras et skflow s'appuient sur ces mécanismes pour fournir des méthodes plus pratiques pour enregistrer et restaurer un modèle entier.

D'après ce que j'ai recueilli jusqu'à maintenant, il existe plusieurs façons de déverser un graphique TensorFlow dans un fichier, puis de le charger dans un autre programme, mais je n'ai pas réussi à trouver des exemples ou des informations claires sur leur fonctionnement. Ce que je sais déjà est ceci:

  1. Enregistrez les variables du modèle dans un fichier de point de contrôle (.ckpt) en utilisant un tf.train.Saver() et restaurez-les plus tard ( source )
  2. Enregistrez un modèle dans un fichier .pb et rechargez-le en utilisant tf.train.write_graph() et tf.import_graph_def() ( source )
  3. Charger dans un modèle à partir d'un fichier .pb, le recycler et le vider dans un nouveau fichier .pb en utilisant Bazel ( source )
  4. Figer le graphique pour enregistrer le graphique et pondérer ensemble ( source )
  5. Utilisez as_graph_def() pour enregistrer le modèle, et pour les poids / variables, les mapper en constantes ( source )

Cependant, je n'ai pas réussi à éclaircir plusieurs questions concernant ces différentes méthodes:

  1. En ce qui concerne les fichiers de point de contrôle, sauvegardent-ils seulement les poids formés d'un modèle? Les fichiers de points de contrôle peuvent-ils être chargés dans un nouveau programme et être utilisés pour exécuter le modèle, ou servent-ils simplement à enregistrer les poids dans un modèle à un moment donné?
  2. En tf.train.write_graph() qui concerne tf.train.write_graph() , les poids / variables sont-ils également sauvegardés?
  3. En ce qui concerne Bazel, peut-il seulement enregistrer dans / charger à partir de fichiers .pb pour la rééducation? Y a-t-il une simple commande Bazel juste pour vider un graphique dans un fichier .pb?
  4. En ce qui concerne le gel, un graphique gelé peut-il être chargé en utilisant tf.import_graph_def() ?
  5. La démo Android pour TensorFlow est chargée dans le modèle Inception de Google à partir d'un fichier .pb. Si je voulais substituer mon propre fichier .pb, comment pourrais-je faire cela? Aurais-je besoin de changer un code / des méthodes natifs?
  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/.pb?

En bref, ce que je cherche est une méthode pour enregistrer à la fois un graphique (comme dans, les différentes opérations et autres) et ses poids / variables dans un fichier, qui peut ensuite être utilisé pour charger le graphique et pondérer dans un autre programme , pour l'utilisation (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.


Juste pour ajouter un autre exemple sur la façon de définir un tf.Variable initialisé en utilisant la méthode de Xavier et Yoshua :

graph = tf.Graph()
with graph.as_default():
    ...
    initializer = tf.contrib.layers.xavier_initializer()
    w1 = tf.Variable(initializer(w1_shape))
    b1 = tf.Variable(initializer(b1_shape))
    ...

Cela m'a empêché d'avoir des valeurs nan sur ma fonction de perte en raison des instabilités numériques lors de l'utilisation de plusieurs couches avec des RELU.





python tensorflow protocol-buffers