web-dev-qa-db-fra.com

Étant donné un graphique de modèle d'écoulement tensoriel, comment trouver les noms des nœuds d'entrée et de sortie

J'utilise un modèle personnalisé pour la classification dans Tensor flow Camera Demo. J'ai généré un fichier .bp et j'ai pu afficher l'énorme graphique qu'il contient. Pour convertir ce graphique en un graphique optimisé, comme indiqué dans [ https://www.oreilly.com/learning/tensorflow-on-Android] , la procédure suivante peut être utilisée:

$ bazel-bin/tensorflow/python/tools/optimize_for_inference  \
--input=tf_files/retrained_graph.pb \
--output=tensorflow/examples/Android/assets/retrained_graph.pb
--input_names=Mul \
--output_names=final_result

Voici comment trouver les noms_entrée et les noms_sortie à partir de l'affichage du graphique. Lorsque je n'utilise pas de noms propres, j'obtiens un plantage de l'appareil:

E/TensorFlowInferenceInterface(16821): Failed to run TensorFlow inference 
with inputs:[AvgPool], outputs:[predictions]

E/AndroidRuntime(16821): FATAL EXCEPTION: inference

E/AndroidRuntime(16821): Java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048]

E/AndroidRuntime(16821):     [[Node: dropout/dropout/mul = Mul[T=DT_FLOAT, 
_device="/job:localhost/replica:0/task:0/cpu:0"](dropout/dropout/div, 
dropout/dropout/Floor)]]
16
Santle Camilus

Essaye ça:

exécuter python

>>> import tensorflow as tf
>>> gf = tf.GraphDef()
>>> gf.ParseFromString(open('/your/path/to/graphname.pb','rb').read())

et alors

>>> [n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Placeholder')]

Ensuite, vous pouvez obtenir un résultat similaire à celui-ci:

['Mul=>Placeholder', 'final_result=>Softmax']

Mais je ne suis pas sûr que ce soit le problème des noms de nœuds concernant les messages d'erreur. Je suppose que vous avez fourni des arguments erronés lors du chargement du fichier graphique ou que votre fichier graphique généré est quelque chose de mal?

Vérifiez cette partie:

E/AndroidRuntime(16821): Java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048]

MISE À JOUR: Désolé, si vous utilisez un graphique (ré) formé, essayez ceci:

[n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Mul')]

Il semble que le graphe (re) formé enregistre le nom d'opération d'entrée/sortie comme "Mul" et "Softmax", tandis que le graphe optimisé et/ou quantifié les enregistre comme "Placeholder" et "Softmax".

BTW, l'utilisation d'un graphique recyclé dans un environnement mobile n'est pas recommandée selon le post de Peter Warden: https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets / . Il est préférable d'utiliser un graphique quantifié ou memmappé en raison de problèmes de performances et de taille de fichier, je n'ai pas pu savoir comment charger le graphique memmapped dans Android cependant ... :( (pas de problème de chargement optimisé/graphique quantifié dans Android)

17
JP Kim

Récemment, je suis tombé sur cette option directement à partir de tensorflow:

bazel build tensorflow/tools/graph_transforms:summarize_graph    
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph
--in_graph=custom_graph_name.pb
9
Santle Camilus