web-dev-qa-db-fra.com

Pourquoi nommons-nous les variables dans Tensorflow?

À certains endroits, j'ai vu la syntaxe, où les variables sont initialisées avec des noms, parfois sans nom. Par exemple:

# With name
var = tf.Variable(0, name="counter")

# Without
one = tf.constant(1)

Quel est l'intérêt de nommer la variable var"counter"?

26
randomizer

Le paramètre name est facultatif (vous pouvez créer des variables et des constantes avec ou sans lui) et la variable que vous utilisez dans votre programme n'en dépend pas. Les noms peuvent être utiles dans quelques endroits:

Lorsque vous souhaitez enregistrer ou restaurer vos variables (vous pouvez les enregistrer dans un fichier binaire après le calcul). De docs :

Par défaut, il utilise la valeur de la propriété Variable.name pour chaque variable

matrix_1 = tf.Variable([[1, 2], [2, 3]], name="v1")
matrix_2 = tf.Variable([[3, 4], [5, 6]], name="v2")
init = tf.initialize_all_variables()

saver = tf.train.Saver()

sess = tf.Session()
sess.run(init)
save_path = saver.save(sess, "/model.ckpt")
sess.close()

Néanmoins, vous avez des variables matrix_1, matrix_2 qui sont enregistrées sous le nom v1, v2 dans le fichier.

Des noms sont également utilisés dans TensorBoard pour indiquer de manière élégante les noms des arêtes. Vous pouvez même les regrouper en utilisant la même portée :

import tensorflow as tf

with tf.name_scope('hidden') as scope:
  a = tf.constant(5, name='alpha')
  W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')
  b = tf.Variable(tf.zeros([1]), name='biases')
35
Salvador Dali

Vous pouvez imaginer les espaces de noms Python et TensorFlow comme deux univers parallèles. Les noms dans l'espace TensorFlow sont en réalité les attributs "réels" appartenant à toutes les variables TensorFlow, tandis que les noms dans l'espace Python ne sont que des pointeurs temporaires pointant vers des variables TensorFlow lors de l'exécution de votre script. C'est pourquoi, lors de la sauvegarde et de la restauration de variables, seuls les noms TensorFlow sont utilisés, car l'espace de noms Python n'existe plus après la fin du script, mais l'espace de noms Tensorflow est toujours présent dans vos fichiers enregistrés.

11
Lifu Huang

Considérez le code de cas d'utilisation suivant et sa sortie

def f():
    a = tf.Variable(np.random.normal(), dtype = tf.float32, name = 'test123')

def run123():
    f()
    init = tf.global_variables_initializer()
    with tf.Session() as sess123:
        sess123.run(init)
        print(sess123.run(fetches = ['test123:0']))
        print(sess123.run(fetches = [a]))

run123()

sortie:

[0.10108799]

NameError Traceback (l'appel le plus récent Last) dans () 10 print (sess123.run (récupère = [a])) 11 ---> 12 run123 ()

dans run123 () 8 sess123.run (init) 9 print (sess123.run (récupère = ['test123: 0']))) ---> 10 print (sess123.run (récupère = [a])) 11 12 run123 ()

NameError: le nom 'a' n'est pas défini

Le 'a', tel que défini dans le champ d'application de f (), n'est pas disponible en dehors de son domaine, c'est-à-dire dans run123 (). Mais le graphe par défaut doit faire référence à eux avec quelque chose, de sorte que le graphe par défaut puisse être référencé, si nécessaire, sur différentes portées et que c'est alors que son name est utile.

6
MiloMinderbinder

En fait, du point de vue de la distinction des variables, nous pouvons totalement utiliser le nom python (la partie gauche du signe d’affectation, et nous appelons le nom python name pour éviter toute confusion. Comme v dans l’exemple suivant) pour nommer les variables . Cependant, dans le processus de programmation, nous relions généralement le nom python à d’autres objets (c’est-à-dire l’opération de Tensorflow), par exemple: 

v = tf.get_variable("v1", [3], initializer = tf.zeros_initializer)
v = tf.get_variable("v2", [5], initializer = tf.zeros_initializer)

Premièrement, le nom python v lie la première ligne du tenseur (tf.get_variable("v1", [3], initializer = tf.zeros_initializer)). Ensuite, la variable v lie le tenseur de la deuxième ligne (tf.get_variable("v2", [5], initializer = tf.zeros_initializer)) et ne lie plus le premier tenseur. Si nous n'avons pas donné le nom d'attribut tensorflow v1 et v2, comment pouvons-nous identifier le tenseur à partir de la première ligne?

0
pangdan