Tensorflow: Comment avoir toutes les variables de rnn_cell.BasicLSTM & rnn_cell.MultiRNNCell
J'ai une configuration où j'ai besoin d'initialiser un LSTM après l'initialisation, qui utilise tf.initialize_all_variables()
. I. e. Je veux l'appeler tf.initialize_variables([var_list])
Est là pour regrouper tous les internes aptes à la formation de variables pour les deux:
- rnn_cell.BasicLSTM
- rnn_cell.MultiRNNCell
afin que je puisse initialiser JUSTE ces paramètres?
La raison principale que je veux c'est parce que je ne veux pas re-initialiser certaines formés valeurs à partir plus tôt.
Vous devez vous connecter pour publier un commentaire.
La meilleure façon de résoudre votre problème est l'utilisation de la portée des variables. Les noms des variables au sein d'un champ d'application sera précédée de son nom. Voici un court extrait:
Il fonctionne de la même façon avec
MultiRNNCell
.EDIT: changé
tf.trainable_variables
àtf.all_variables()
tf.trainable_variables()
respecte, mais je pense, avec le recul, cela fait sens!tf.all_variables()
au lieu detf.trainable_variables()
serait un meilleur choix. Principalement parce que il ya des choses comme les optimiseurs qui n'ont pas les moyens variables, qui serait pourtant encore besoin d'être initialisé.v.name.startswith(vs.name + "/")
car il pourrait y avoir une autre portée avec le même préfixe de nom, par exemple "LSTM2".Vous pouvez également utiliser
tf.get_collection()
:(en partie copié à partir de Rafal réponse)
Noter que la dernière ligne est équivalente à la compréhension de liste dans Rafal du code.
Fondamentalement, tensorflow magasins une collection mondiale de variables, qui peuvent être récupérés par
tf.all_variables()
outf.get_collection(tf.GraphKeys.VARIABLES)
. Si vous spécifiezscope
(nom de l'étendue) dans letf.get_collection()
fonction, alors vous ne chercher tenseurs (variables dans ce cas) dans la collection dont les portées sont sous la portée spécifiée.EDIT:
Vous pouvez également utiliser
tf.GraphKeys.TRAINABLE_VARIABLES
pour obtenir éducables variables seulement. Mais depuis la vanille BasicLSTMCell ne s'initialise pas non éducables variable, les deux seront fonctionnellement équivalent. Pour une liste complète de graphique par défaut collections, vérifiez cette out.tf.get_collection(..., scope=vs.name + "/")
car il pourrait y avoir un autre champ nommé "LSTM2" ou alors.