Astuces d'apprentissage automatique - Utilisation de plusieurs modèles dans Keras

Ceci est mon premier article sur l'apprentissage automatique. Récemment, je me suis engagé professionnellement dans l'apprentissage automatique et la vision par ordinateur. Dans cet article et les futurs, je partagerai des observations et des solutions à des problèmes spécifiques lors de l'utilisation de TensorFlow et Keras. Dans cet article, je vais parler d'un problème non évident lorsque vous travaillez avec TensorFlow et Keras - le chargement et l'exécution simultanés de plusieurs modèles. Si vous ne savez pas comment TensorFlow et Keras fonctionnent en interne, cette rubrique peut être un problème pour les débutants. Si vous êtes intéressé par le sujet, veuillez sous le chat.

TensorFlow présente les calculs dans le modèle de réseau de neurones en mémoire sous forme de graphique des dépendances entre les opérations lors de l'initialisation. Lors de l'exécution du modèle, TensorFlow effectue des calculs sur le graphique dans une session spécifique. Je n'entrerai pas dans les détails de ces entités dans Tensorflow.

Vous pouvez en savoir plus sur les graphiques et les sessions sur Medium et Habré: ici et ici .

Habituellement, nous travaillons avec un modèle et il n'y a aucun problème ici. Imaginons maintenant que nous travaillons avec deux classes. Les deux classes fonctionnent avec des modèles Keras: créer une architecture neuronale, charger des poids entraînés et effectuer des prédictions. Lors de l'exécution de deux classes dans un pipeline (par exemple, dans la première étape, nous effectuons la détection de visage sur la photo, dans la prochaine - reconnaissance humaine), une erreur similaire peut se produire:

Error Tensor("norm_layer/l2_normalize:0", shape=(?, 128), dtype=float32) is not an element of this graph 

La raison de l'erreur est que Keras par défaut ne fonctionne qu'avec la session par défaut et n'enregistre pas la nouvelle session comme session par défaut.
Lorsqu'il travaille avec le modèle Keras, l'utilisateur doit définir explicitement la nouvelle session comme session par défaut. Cela peut être fait comme ceci:

 self.graph = tf.Graph() with self.graph.as_default(): self.session = tf.Session(graph=self.graph) with self.session.as_default(): self.model = WideResNet(face_size, depth=depth, k=width)() model_dir = <model_path> ... self.model.load_weights(fpath) 

Nous créons un nouveau graphique et une nouvelle session TensorFlow et chargeons le modèle dans la nouvelle session TensorFlow.
String

 with self.graph.as_default(): 

signifie que nous voulons utiliser le nouveau graphique () comme graphique par défaut et dans la ligne

 with self.session.as_default(): 

nous indiquons que nous voulons utiliser self.session comme session par défaut et exécuter le code suivant dans cette session. La construction with crée un gestionnaire de contexte qui nous permet de travailler efficacement avec la mémoire lors du traitement d'objets gourmands en ressources (par exemple, la lecture de fichiers), car elle libère automatiquement des ressources lorsque nous quittons le bloc with.

Lorsque nous devons réaliser la prédiction, nous le faisons comme ceci:

 with self.graph.as_default(): with self.session.as_default(): result = self.model.predict(np.expand_dims(img, axis=0), batch_size=1) 

Nous appelons simplement la méthode Predict () dans la session TF créée précédemment.

C'est tout pour l'instant. Bonne chance à tous et à bientôt!

Source: https://habr.com/ru/post/fr465093/


All Articles