web-dev-qa-db-fra.com

Comment puis-je convertir un modèle Tensorflow formé en Keras?

J'ai un modèle Tensorflow formé et un vecteur de poids qui ont été exportés respectivement vers des fichiers protobuf et poids.

Comment puis-je les convertir en fichiers JSON ou YAML et HDF5 qui peuvent être utilisés par Keras?

J'ai le code du modèle Tensorflow, il serait donc également acceptable de convertir le tf.Session dans un modèle de keras et enregistrez-le dans le code.

19
Matt D

Actuellement, il n'y a pas de prise en charge directe intégrée dans Tensorflow ou Keras pour convertir le modèle figé ou le fichier de point de contrôle au format hdf5.

Mais puisque vous avez mentionné que vous avez le code du modèle Tensorflow, vous devrez réécrire le code de ce modèle dans Keras. Ensuite, vous devrez lire les valeurs de vos variables dans le fichier de point de contrôle et les affecter au modèle Keras à l'aide de la méthode layer.load_weights(weights).

Plus que cette méthodologie, je vous suggère de suivre la formation directement dans Keras car elle prétend que les optimiseurs de Keras sont 5 à 10% plus rapides que les optimiseurs de Tensorflow . Une autre façon consiste à écrire votre code dans Tensorflow avec le module tf.contrib.keras et à enregistrer le fichier directement au format hdf5.

10
user1190882

Je pense que le rappel en keras est également une solution.

Le fichier ckpt peut être enregistré par TF avec:

saver = tf.train.Saver()
saver.save(sess, checkpoint_name)

et pour charger le point de contrôle dans Keras, vous avez besoin d'une classe de rappel comme suit:

class RestoreCkptCallback(keras.callbacks.Callback):
    def __init__(self, pretrained_file):
        self.pretrained_file = pretrained_file
        self.sess = keras.backend.get_session()
        self.saver = tf.train.Saver()
    def on_train_begin(self, logs=None):
        if self.pretrian_model_path:
            self.saver.restore(self.sess, self.pretrian_model_path)
            print('load weights: OK.')

Puis dans votre script keras:

 model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
 restore_ckpt_callback = RestoreCkptCallback(pretrian_model_path='./XXXX.ckpt') 
 model.fit(x_train, y_train, batch_size=128, epochs=20, callbacks=[restore_ckpt_callback])

Ce sera parfait. Je pense que c'est facile à mettre en œuvre et j'espère que cela aide.

11
Jiang Xiang

Francois Chollet, le créateur des keras, a déclaré dans 04/2017 "vous ne pouvez pas transformer un point de contrôle TensorFlow arbitraire en un modèle Keras. Ce que vous pouvez faire, cependant, est de construire un modèle Keras équivalent puis de charger dans ce modèle Keras les poids", voir https://github.com/keras-team/keras/issues/527 . À ma connaissance, cela n'a pas changé.

Un petit exemple:

Tout d'abord, vous pouvez extraire les poids d'un point de contrôle tensorflow comme celui-ci

PATH_REL_META = r'checkpoint1.meta'

# start tensorflow session
with tf.Session() as sess:

    # import graph
    saver = tf.train.import_meta_graph(PATH_REL_META)

    # load weights for graph
    saver.restore(sess, PATH_REL_META[:-5])

    # get all global variables (including model variables)
    vars_global = tf.global_variables()

    # get their name and value and put them into dictionary
    sess.as_default()
    model_vars = {}
    for var in vars_global:
        try:
            model_vars[var.name] = var.eval()
        except:
            print("For var={}, an exception occurred".format(var.name))

Il peut également être utile d'exporter le modèle tensorflow pour une utilisation dans tensorboard, voir https://stackoverflow.com/a/43569991/2135504

Deuxièmement, vous construisez votre modèle de kéros comme d'habitude et le finalisez par "model.compile". Faites attention à ce que vous devez vous donner pour définir chaque couche par son nom et l'ajouter au modèle après cela, par exemple.

layer_1 = keras.layers.Conv2D(6, (7,7), activation='relu', input_shape=(48,48,1))
net.add(layer_1)
...
net.compile(...)

Troisièmement, vous pouvez définir les poids avec les valeurs du tensorflow, par ex.

layer_1.set_weights([model_vars['conv7x7x1_1/kernel:0'], model_vars['conv7x7x1_1/bias:0']])
7
gebbissimo

Je ne sais pas si c'est ce que vous recherchez, mais il m'est arrivé de faire de même avec le nouveau support des keras dans TF 1.2. Vous pouvez trouver plus d'informations sur l'API ici: https://www.tensorflow.org/api_docs/python/tf/contrib/keras

Pour vous faire gagner un peu de temps, j'ai également constaté que je devais inclure des modules keras comme indiqué ci-dessous avec les python.keras supplémentaires ajoutés à ce qui est montré dans les documents API.

de tensorflow.contrib.keras.python.keras.models import Sequential

J'espère que cela vous aidera à aller où vous voulez aller. Essentiellement, une fois intégré à, vous n'avez qu'à gérer votre modèle/export de poids comme d'habitude.

2
xtr33me