À 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"
?
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')
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.
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.
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?