135 votes

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 de l'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?

92voto

Lukasz Kaiser Points 1820

Je recommanderais de toujours utiliser tf.get_variable(...) - cela simplifiera considérablement la refactorisation de votre code si vous devez partager des variables à tout moment, par exemple dans un paramètre multi-gpu (voir le fichier CIFAR multi-gpu). Exemple). Il n'y a aucun inconvénient à cela.

Pure tf.Variable est de niveau inférieur; à un moment donné, tf.get_variable() n'existait pas, de sorte que certains codes utilisent toujours la méthode de bas niveau.

71voto

Sung Kim Points 57

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.

W = tf.Variable(<initial-value>, name=<optional-name>)

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.

W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None,
       regularizer=None, trainable=True, collections=None)

Il est très utile d'utiliser les initialiseurs comme xavier_initializer:

W = tf.get_variable("W", shape=[784, 256],
       initializer=tf.contrib.layers.xavier_initializer())

Plus d'informations sur https://www.tensorflow.org/versions/r0.8/api_docs/python/state_ops.html#Variable.

48voto

ASDF Points 123

Je peux trouver les deux principales différences entre l'un et l'autre:

  1. La première est qu' tf.Variable sera toujours de créer une nouvelle variable, si tf.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.

  2. tf.Variable nécessite une 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:

with tf.variable_scope("one"):
    a = tf.get_variable("v", [1]) #a.name == "one/v:0"
with tf.variable_scope("one"):
    b = tf.get_variable("v", [1]) #ValueError: Variable one/v already exists
with tf.variable_scope("one", reuse = True):
    c = tf.get_variable("v", [1]) #c.name == "one/v:0"

with tf.variable_scope("two"):
    d = tf.get_variable("v", [1]) #d.name == "two/v:0"
    e = tf.Variable(1, name = "v", expected_shape = [1]) #e.name == "two/v_1:0"

assert(a is c)  #Assertion is true, they refer to the same object.
assert(a is d)  #AssertionError: they are different objects
assert(d is e)  #AssertionError: they are different objects

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 et e vous vous rendrez compte que Tensorflow changé le nom de la variable e:

d.name   #d.name == "two/v:0"
e.name   #e.name == "two/v_1:0"

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