Dans TensorFlow est-il possible d'initialiser non initialisée variables?
Le niveau moyen de l'initialisation des variables dans TensorFlow est
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
Après l'exécution de certains d'apprentissage pour un moment, j'ai créer un nouvel ensemble de variables, mais une fois que je les initialiser, il réinitialise toutes mes variables existantes. En ce moment, ma façon de contourner cela est d'enregistrer toutes les variables dont j'ai besoin et puis réappliquer après la tf.initalize_all_variables appel. Cela fonctionne, mais c'est un peu laid et maladroit. Je ne peux pas trouver quelque chose comme cela dans les docs...
Personne ne sait de toute bonne façon d'initialiser les variables non initialisées?
- Le
tf.train.Optimizer.minimize(loss)
fonction est définie dans la documentationoptim.apply_gradients(optim.compute_gradients(loss))
. Ce serait faire de votre exemple la même que la mienne, sauf que vous jetez toutes lesNone
s. Pouvez-vous courir letrain_step
après cela? Lorsque je l'ai exécuté, tous les logements ont étéNone
de sorte que l'optimiseur est resté initialisé et le réseau de neurones n'a pas pu exécuter. - Voici un exemple de simple qui fait exactement ce que vous voulez.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas élégant* pour énumérer les variables non initialisées dans un graphe. Toutefois, si vous avez accès à la nouvelle variable objets—appelons-la
v_6
,v_7
, etv_8
—vous pouvez choisir de les initialiser à l'aide detf.initialize_variables()
:* Un processus d'essai et d'erreur pourrait être utilisé pour identifier les variables non initialisées, comme suit:
...cependant, je ne voudrais pas tolérer un tel comportement :-).
Mise à JOUR: TensorFlow 0.9 a une nouvelle méthode qui "corrige" tout ce mais seulement si vous utilisez un VariableScope avec
reuse
ensemble deTrue
. tf.report_uninitialized_variables qui peut être utilisé dans une ligne avecsess.run( tf.initialize_variables( list( tf.get_variable(name) for name in sess.run( tf.report_uninitialized_variables( tf.all_variables( ) ) ) ) ) )
ou plus intelligemment grâce à la possibilité de spécifier les variables que vous vous attendez à être initialisé:
C'est encore moins idéal que de savoir qui sont les variables et ne sont pas initialisées et en prenant soin de que bien, mais dans le cas de "détournement" comme le
optim
classes (voir ci-dessous), il peut être difficile de les éviter.Noter également, tf.initialize_variables ne peut pas évaluer tf.report_uninitialized_variables, de sorte que les deux d'entre eux ont à être exécuté dans le contexte de la session de travail.
Il y a un peu élégante, mais concis façon de le faire. Avant de présenter votre nouveau variables exécuter
temp = set(tf.all_variables())
et ensuite exécutersess.run(tf.initialize_variables(set(tf.all_variables()) - temp))
. Ensemble, ils ne initialiser toutes les variables créées après le temp la valeur est affectée.J'ai joué avec le transfert de l'apprentissage, donc je voulais un moyen rapide de le faire aussi, mais c'est le mieux que j'ai pu trouver. En particulier lors de l'utilisation de choses comme AdamOptimizer, qui ne vous donne pas facile (ou tout, je ne suis pas sûr) l'accès à des variables qu'il utilise. Donc ce qui suit s'affiche en fait dans mon code. (J'initialise la nouvelle couche explicitement les variables, et de l'exécuter une fois pour afficher l'erreur initiale avant le transfert de l'apprentissage. Juste pour un test de cohérence.)
Et il résout tous mes problèmes.
EDIT: @Lifu_Huang réponse les états la bonne façon de régler mon problème. En théorie, vous devriez utiliser tf.le train.L'optimiseur.get_slot_names et tf.le train.L'optimiseur.get_slot:
Toutefois, cela me donne
AttributeError: 'NoneType' object has no attribute 'initializer'
. Je vais faire des modifications, lorsque je comprendre ce que j'ai fait de mal, de sorte que vous ne faites pas mon erreur.AttributeError: 'NoneType' object has no attribute 'initializer'
question.AdamOptimizer
pour moi aussi crée l'vars[<tf.Variable 'optimize/beta1_power:0' shape=() dtype=float32_ref>, <tf.Variable 'optimize/beta2_power:0' shape=() dtype=float32_ref>]
qui ne correspondent pas à un éducables var, donc vous n'obtenez pas comme des machines à sous.TF n'a pas une fonction qui fait exactement ce que vous voulez, mais vous pouvez facilement écrire:
Ici, j'ai extrait tous les les variables globales, itérer tous, et de vérifier si elles sont déjà initialisé. Après cela, j'obtiens une liste de variables non initialisées qui je initialiser. J'ai aussi l'impression des variables que je vais initialiser à des fins de débogage.
Vous pouvez facilement vérifier qu'il fonctionne comme prévu:
Cela permettra d'imprimer tous les non initialisé les variables avant l'initialisation et la dernière sess.run sera assurez-vous vous convaincre que toutes les variables sont initialisées.
Vous pouvez également utiliser
tf.report_uninitialized_variables()
écrire une fonction similaire. Un croquis est ici.tf.report_uninitialized_variables()
être une meilleure approche?Pour le cas @Poik mentionné, lorsque les variables sont créées par les optimiseurs de sorte qu'elles ne soient pas accessibles directement, une meilleure solution est d'utiliser
tf.train.Optimizer.get_slot
.Certains optimiseur de sous-classes, comme
MomentumOptimizer
etAdagradOptimizer
d'allouer et de gérer d'autres variables associées aux variables de train. Celles-ci sont appelées machines à sous. Vous pouvez utilisertf.train.Optimizer.get_slot_names()
pour obtenir toutes les machines à sous les noms d'un optimiseur de a et ensuite utilisertf.train.Optimizer.get_slot
récupérer la variable allouée pour ces logements.tf.train.Optimizer.get_slot
retourneNone
pour les fentes jusqu'à ce que l'optimiseur crée les variables nécessaires, ce qui va se passer quandminimize
est exécuté pour la première fois. Obtenir autour de cette nécessite d'appeler les sans-papiers de la fonctiontf.train.Optimizer._zeros_slot()
ou d'autres que vous ne devriez jamais faire si vous voulez la documentation de soutien et d'être en mesure d'utiliser les futures mises à jour de TensorFlow.AdamOptimizer
pour moi aussi crée l'vars[<tf.Variable 'optimize/beta1_power:0' shape=() dtype=float32_ref>, <tf.Variable 'optimize/beta2_power:0' shape=() dtype=float32_ref>]
qui ne correspondent pas à un éducables var, donc vous n'obtenez pas comme des machines à sous.J'ai trouvé une méthode pour TensorFlow r0.11:
Btw, si vous souhaitez initialiser un seul tenseur (par exemple
tf.Variable
) qui n'a pas été initialisé à l'aide detf.global_variables_initializer()
, alors vous pouvez utiliseryour_tensor.initializer
dans lesess.run()
comme dans l'exemple suivant:Je pense que le plus simple est de créer tous les opérateurs de formation première et initialiser des variables par la suite.
Par exemple, j'ai résolu le problème de la couche-sage préformation avec Adam Optimiseur de la manière suivante: