Autant que je sache, Variable
c'est l'opération par défaut pour créer une variable, et get_variable
est principalement utilisée pour le partage de poids.
D'une part, certaines personnes suggèrent d'utiliser à la get_variable
place de l' Variable
opération primitive chaque fois que vous avez besoin d'une variable. D'un autre côté, je vois simplement toute utilisation de get_variable
dans les documents officiels et les démos de TensorFlow.
Je souhaite donc connaître quelques règles empiriques sur la manière d'utiliser correctement ces deux mécanismes. Existe-t-il des principes «standards»?
python
tensorflow
Lifu Huang
la source
la source
Réponses:
Je recommanderais de toujours utiliser
tf.get_variable(...)
- cela facilitera la refactorisation de votre code si vous avez besoin de partager des variables à tout moment, par exemple dans un paramètre multi-gpu (voir l'exemple CIFAR multi-gpu). Il n'y a aucun inconvénient à cela.Pure
tf.Variable
est de niveau inférieur; à un moment donné, iltf.get_variable()
n'existait pas, donc certains codes utilisent toujours la méthode de bas niveau.la source
tf.Variable
partf.get_variable
partout. C'est à ce moment que je veux initialiser une variable avec un tableau numpy, je ne peux pas trouver un moyen propre et efficace de le faire comme je le fais avectf.Variable
. Comment le résolvez-vous? Merci.tf.Variable est une classe, et il existe plusieurs façons de créer tf.Variable, y compris
tf.Variable.__init__
ettf.get_variable
.tf.Variable.__init__
: Crée une nouvelle variable avec valeur_initial .tf.get_variable
: Obtient une variable existante avec ces paramètres ou en crée une nouvelle. Vous pouvez également utiliser l'initialiseur.Il est très utile d'utiliser des initialiseurs tels que
xavier_initializer
:Plus d'informations ici .
la source
Variable
fait, je veux dire en utilisant son__init__
. Commeget_variable
c'est si pratique, je me demande pourquoi la plupart du code TensorFlow que j'ai vu utiliser à laVariable
placeget_variable
. Y a-t-il des conventions ou des facteurs à prendre en compte lors du choix entre eux. Je vous remercie!tf.Variable()
nous pouvons l'initialiser en tant que 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')
. Quel serait l'équivalent de cela? comment dire que je veux une normale tronquée? Dois-je juste 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 deux différences principales entre l'un et l'autre:
Tout d'abord, cela
tf.Variable
créera toujours une nouvelle variable, alors quetf.get_variable
récupère une variable existante avec des paramètres spécifiés à partir du graphique, et si elle n'existe pas, en crée une nouvelle.tf.Variable
nécessite qu'une valeur initiale soit spécifiée.Il est important de préciser que la fonction
tf.get_variable
préfixe le nom avec la portée de la variable actuelle pour effectuer des vérifications de réutilisation. Par exemple:La dernière erreur d'assertion est intéressante: deux variables de même nom sous la même portée sont supposées être la même variable. Mais si vous testez les noms des variables
d
et quee
vous vous rendrez compte que Tensorflow a changé le nom de la variablee
:la source
d.name
ete.name
, je viens de tomber sur un document TensorFlow sur l'opération de dénomination des graphes tensoriels 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'un est en
('variable_store',)
collection mais que l'autre ne l'est pas.Veuillez consulter le code source :
Laissez-moi illustrer cela:
Le résultat:
la source