51 votes

Pourquoi ai-je besoin du modèle K.clear_session() et del (Keras avec Tensorflow-gpu)?

Ce que je fais
Je suis à la formation et à l'aide d'une convolution de neurones network (CNN) pour l'image de la classification à l'aide de Keras avec Tensorflow-gpu comme backend.

Ce que je suis en utilisant
- PyCharm Communauté 2018.1.2
- Python 2.7 et 3.5 (mais pas les deux à la fois)
- Ubuntu 16.04
- Keras 2.2.0
- Tensorflow-GPU 1.8.0 comme backend

Ce que je veux savoir
Dans de nombreux codes, je vois des gens à l'aide de

from keras import backend as K 

# Do some code, e.g. train and save model

K.clear_session()

ou de la suppression du modèle après l'avoir utilisé:

del model

Le keras documentation dit concernant l' clear_session: "Détruit l'actuel TF graphique et en crée une nouvelle. Utile pour éviter l'encombrement à partir d'anciens modèles / couches." - https://keras.io/backend/

Qu'est-ce que le point de le faire et que dois-je faire? Lors du chargement ou de la création d'un nouveau modèle de mon modèle est écrasée de toute façon, alors pourquoi s'embêter?

39voto

Chris Swinchatt Points 362

K. clear_session() est utile lorsque vous êtes à la création de plusieurs modèles dans la succession, comme lors de l'hyper-paramètre de recherche ou de validation croisée. Chaque modèle vous former ajoute des nœuds (potentiellement se chiffrent en milliers) pour le graphique. TensorFlow exécute l'ensemble du graphique à chaque fois que vous (ou Keras) appel tf.Session.run() ou tf.Tenseur.la fonction eval(), de sorte que vos modèles de plus en plus lente à former, et vous pouvez également exécuter de mémoire. De compensation de la session supprime tous les nœuds de la gauche au cours des précédents modèles, la libération de la mémoire et de la prévention de ralentissement.

Edit 21/06/19: TensorFlow est paresseux-évalué par défaut. TensorFlow opérations ne sont pas évalués immédiatement: la création d'un tenseur ou de faire des opérations à il crée des nœuds dans un graphe de flux de données. Les résultats sont calculés en évaluant les parties pertinentes du graphe en une seule fois lorsque vous appelez tf.Session.run() ou tf.Tenseur.la fonction eval(). C'est donc TensorFlow pouvez construire un plan d'exécution qui alloue les opérations qui peuvent être effectuées en parallèle à différents dispositifs. Il peut également plier nœuds adjacents ensemble ou supprimer redondante (p. ex. si vous concaténées deux tenseurs et, plus tard, de les diviser à nouveau inchangé). Pour plus de détails, voir https://www.tensorflow.org/guide/graphs

Tous vos TensorFlow les modèles sont stockés dans le graphique comme une série de tenseurs et tenseur des opérations. Le fonctionnement de base de l'apprentissage de la machine est le tenseur de produit scalaire - la sortie d'un réseau de neurones est le produit scalaire de la matrice d'entrée et le réseau des poids. Si vous avez une seule couche de perceptron et 1 000 formation des échantillons, puis chaque époque crée au moins 1 000 tenseur des opérations. Si vous avez de 1 000 époques, alors votre graphe contient au moins 1 000 000 nœuds à la fin, avant la prise en compte de prétraitement, le traitement, et des modèles plus complexes, tels que les récurrente des filets, le codeur-décodeur, attention les modèles, etc.

Le problème, c'est que finalement le graphique serait trop grand pour tenir dans la mémoire vidéo (6 GO dans mon cas), donc TF faisait la navette parties du graphe à partir de la vidéo à la mémoire principale et le dos. Finalement, il serait même trop volumineux pour la mémoire principale (12 GO) et commencer à se déplacer entre la mémoire principale et le disque dur. Inutile de dire que cela fait des choses incroyable, et de plus en plus lente que la formation s'est passé. Avant de développer ce enregistrez-modèle/clair-session/reload-modèle de flux, j'ai calculé que, à chaque époque, le taux de ralentissement j'ai vécu, mon modèle aurait pris plus de temps que l'âge de l'univers pour terminer la formation. Avertissement: je n'ai pas utilisé TensorFlow en près d'un an, donc cela peut avoir changé. Je me souviens d'y être tout à fait un peu de GitHub questions autour de cette alors j'espère qu'il a depuis été corrigé.

6voto

Tawej Points 64

del supprimera variable en python et puisque le modèle est une variable, le modèle del le supprimera mais le graphique TF n'aura aucun changement (TF est votre backend Keras). Cela dit, K.clear_session() va détruire le graphique TF actuel et en crée un nouveau. La création d'un nouveau modèle semble être une étape indépendante, mais n'oubliez pas le backend :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X