Comment exporter Keras .h5 à tensorflow .le pb?
J'ai affiné la création de modèle avec un nouveau jeu de données et enregistré comme ".h5 modèle de Keras. maintenant, mon objectif est de courir mon modèle sur android Tensorflow qui l'accepte ".pb" extension. la question est qui est là n'importe quelle bibliothèque dans Keras ou tensorflow pour faire cette conversion? J'ai vu ce post jusqu'à présent : https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html mais ne peut pas trouver encore.
Vous devez vous connecter pour publier un commentaire.
Keras ne comprend pas par lui-même tous les moyens pour exporter un TensorFlow graphique comme un protocole de tampons de fichier, mais vous pouvez le faire en utilisant des TensorFlow utilitaires. Ici est un billet de blog expliquant comment le faire en utilisant l'utilitaire de script
freeze_graph.py
inclus dans TensorFlow, qui est "typique" manière dont c'est fait.Cependant, personnellement, je trouve un ennui d'avoir à faire un point de contrôle, puis exécutez un script externe pour obtenir un modèle, et préfèrent se faire à partir de mon propre code Python, j'ai donc utiliser une fonction comme ceci:
Qui est inspiré dans la mise en œuvre de
freeze_graph.py
. Les paramètres sont similaires à l'script trop.session
est le TensorFlow objet de session.keep_var_names
n'est nécessaire que si vous souhaitez conserver certaines variables non congelés (par exemple pour la dynamique des modèles), donc généralement pas.output_names
une liste avec les noms des opérations de produire les résultats que vous voulez.clear_devices
supprime juste tout appareil directives pour rendre le graphique plus portable. Ainsi, pour un type Kerasmodel
avec une sortie, vous feriez quelque chose comme:Ensuite, vous pouvez écrire le graphique vers un fichier comme d'habitude avec
tf.le train.write_graph
:[out.op.name for out in model.outputs]
- en fait, je vais changer cela dans la réponse, car il est plus général)tf.keras.backend.get_session()
au lieu deK.get_session()
convert_variables_to_constants
(qui "gèle" les variables et les pruneaux dans le graphique).output_names
(par exempleoutput_names=[op.name for op in tf.get_default_graph().get_operations()]
).La freeze_session méthode fonctionne très bien. Mais par rapport à l'enregistrement d'un fichier de point de contrôle, puis en utilisant la freeze_graph outil qui vient avec TensorFlow semble plus simple pour moi, car il est plus facile à maintenir. Tout ce que vous devez faire est de les deux étapes suivantes:
D'abord, à ajouter après votre Keras code
model.fit(...)
et de former votre modèle:Puis des cd pour votre TensorFlow répertoire racine, exécutez:
Keras error “You must feed a value for placeholder tensor 'keras_learning_phase' with dtype bool”
lors de l'exécution sur android. J'ai mis 0 parce que je n'ai besoin que le modèle de l'inférence.L'exemple simple suivant (XOR exemple) montre comment exporter Keras modèles (dans les deux
h5
format etpb
format), et en utilisant le modèle en Python et C++:train.py:
predict.py:
opencv-predict.py:
predict.cpp:
import tensorflow as tf
from tensorflow.python.platform import gfile
f = gfile.FastGFile(r'.\xor\xor.pb', 'rb')
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
f.close()
tfSession = tf.InteractiveSession()
tfSession.graph.as_default()
tf.import_graph_def(graph_def)
out = tfSession.graph.get_tensor_by_name('import/dense_4/Sigmoid:0')
tfSession.run(out, {'import/dense_input:0': np.array([[0,0]])})
Il y a un point très important lorsque vous souhaitez convertir en tensorflow. Si vous utilisez d'abandon, de lot, de la normalisation ou de tout autres couches comme celui-ci (qui n'ont pas éducables mais le calcul de valeurs), vous devriez changer la phase d'apprentissage de keras backend. Voici une discussion à ce sujet.
Si vous voulez le modèle de l'inférence, vous devez d'abord geler le graphique, puis de l'écrire comme un
.pb
fichier. L'extrait de code ressemble à ceci (code emprunté à partir d'ici):Vous pouvez le faire ci-dessus à l'aide de la keras_to_tensorflow outil: https://github.com/amir-abdi/keras_to_tensorflow
La keras_to_tensorflow outil prend en charge les opérations ci-dessus, avec quelques fonctionnalités supplémentaires pour une plus grande diversité de solution. Il vous suffit d'appeler avec les bons arguments d'entrée (par exemple,
input_model
etoutput_model
drapeaux).Si vous souhaitez recycler le modèle dans tensorflow, utilisez l'outil au-dessus avec le
output_meta_ckpt
drapeau à l'exportation des points de contrôle et les méta graphiques.Veuillez utiliser tf.saved_model.simple_save, quelques exemples de codes:
===mise à jour====
Vous pouvez utiliser as_a_saved_model, exemple des codes:
à l'aide de l'estimateur.export_savedmodel nous peut facilement convertir h5 modèle à modèle enregistré.
vérifier la doc ici https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator