Différence entre Variable et get_variable dans TensorFlow
Autant que je sache, Variable
est le fonctionnement par défaut pour la fabrication d'une variable, et get_variable
est principalement utilisé pour le poids de partage.
D'une part, il y a quelques personnes en train de suggérer à l'aide de get_variable
au lieu de la primitive Variable
opération chaque fois que vous besoin d'une variable. D'autre part, je me contenterai de voir toute utilisation de get_variable
dans TensorFlow de documents officiels et de démos.
Donc je veux savoir quelques règles de base sur la façon d'utiliser correctement ces deux mécanismes. Il n'existe aucun "standard" principes?
- get_variable est nouvelle façon, la Variable est ancienne (ce qui pourrait être pris en charge pour toujours) que Lukasz dit (PS: il a écrit la plupart de la variable nom de la portée dans TF)
Vous devez vous connecter pour publier un commentaire.
Je vous recommande de toujours utiliser
tf.get_variable(...)
-- il sera plus facile de revoir votre code si vous avez besoin de partager des variables à tout moment, par exemple dans une configuration multi-gpu (voir le multi-gpu de l'ICRA exemple). Il n'y a aucun inconvénient à cela.Pur
tf.Variable
est de niveau inférieur; à un certain pointtf.get_variable()
n'existe pas, donc un peu de code utilise toujours le faible niveau moyen.tf.Variable
avectf.get_variable
partout. C'est quand je veux initialiser une variable avec un tableau numpy, je ne peux pas trouver un endroit propre et efficace de le faire comme je le fais avectf.Variable
. Comment voulez-vous résoudre? Merci.tf.Variable est une classe, et il y a plusieurs façons de créer des tf.Variable y compris les tf.Variable.__init__ et de la tf.get_variable.
tf.Variable.__init__: Crée une nouvelle variable avec initial_value.
tf.get_variable: Récupère une variable existante avec ces paramètres, ou en créer un nouveau. Vous pouvez également utiliser de l'initialiseur.
Il est très utile d'utiliser les initialiseurs comme xavier_initializer:
Plus d'informations à https://www.tensorflow.org/versions/r0.8/api_docs/python/state_ops.html#Variable.
Variable
en fait je veux dire à l'aide de son__init__
. Depuisget_variable
est tellement pratique, je me demande pourquoi la plupart des TensorFlow code, j'ai vu l'utilisationVariable
au lieu deget_variable
. Existe-il des conventions ou des facteurs à considérer au moment de choisir entre eux. Merci!!!!tf.Variable()
on peut l'initialiser comme une valeur aléatoire à partir d'une distribution normale tronquée. Voici mon exemplew1 = tf.Variable(tf.truncated_normal([5, 50], stddev = 0.01), name = 'w1')
. Ce serait l'équivalent de ce être? comment puis-je lui dire que je veux une normale tronquée? Dois-je simplement fairew1 = tf.get_variable(name = 'w1', shape = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)
?tf.truncated_normal_initializer()
pour obtenir le résultat souhaité.Je peux trouver les deux principales différences entre l'un et l'autre:
Première est que
tf.Variable
toujours créer une nouvelle variable, sitf.get_variable
obtient à partir du graphique d'une variable existante avec ces paramètres, et si elle n'existe pas, il en crée un nouveau.tf.Variable
exige que la valeur initiale être spécifié.Il est important de préciser que la fonction
tf.get_variable
précéder le nom de la variable courante portée pour effectuer la réutilisation des contrôles. Par exemple:La dernière erreur d'assertion est intéressant: Deux variables avec le même nom dans le même champ d'application sont censés être de la même variable. Mais si vous testez les noms de variables
d
ete
vous vous rendrez compte que Tensorflow changé le nom de la variablee
:d.name
ete.name
, je viens de tomber sur un ce TensorFlow doc sur le tenseur graphique opération de dénomination qui l'explique:If the default graph already contained an operation named "answer", the TensorFlow would append "_1", "_2", and so on to the name, in order to make it unique.
Une autre différence réside dans le fait que l'on est dans
('variable_store',)
de la collection, mais l'autre ne l'est pas.Veuillez voir la source code:
Permettez-moi de l'illustrer:
La sortie: