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)]]
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)
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