¿Por qué nombramos variables en Tensorflow?
En algunos de los lugares, vi la sintaxis, donde las variables se inicializan con nombres, a veces sin nombres. Por ejemplo:
# With name
var = tf.Variable(0, name="counter")
# Without
one = tf.constant(1)
¿ Cuál es el punto de nombrar la variable var
"counter"
?
El name
parámetro es opcional (puedes crear variables y constantes con o sin él), y la variable que uses en tu programa no depende de él. Los nombres pueden ser útiles en un par de lugares:
Cuando desee guardar o restaurar sus variables (puede guardarlas en un archivo binario después del cálculo). De documentos :
Por defecto, utiliza el valor de la propiedad Variable.name para cada 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()
No obstante, tiene variables matrix_1
, matrix_2
se guardan como v1
en v2
el archivo.
También se utilizan nombres en TensorBoard para mostrar claramente los nombres de los bordes . Incluso puedes agruparlos usando el mismo alcance :
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')
Puedes imaginar el espacio de nombres de Python y el espacio de nombres de TensorFlow como dos universos paralelos. Los nombres en el espacio de TensorFlow son en realidad los atributos "reales" que pertenecen a cualquier variable de TensorFlow, mientras que los nombres en el espacio de Python son solo punteros temporales que apuntan a las variables de TensorFlow durante la ejecución de su script. Esa es la razón por la que al guardar y restaurar variables, solo se usan los nombres de TensorFlow, porque el espacio de nombres de Python ya no existe después de que se finaliza el script, pero el espacio de nombres de Tensorflow todavía está ahí en sus archivos guardados.
Considere el siguiente código de caso de uso y su resultado.
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()
producción:
[0,10108799]
NameError Traceback (última llamada más reciente) en () 10 print(sess123.run(fetches = [a])) 11 ---> 12 run123()
en run123() 8 sess123.run(init) 9 print(sess123.run(fetches = ['test123:0'])) ---> 10 print(sess123.run(fetches = [a])) 11 12 run123 ()
NameError: el nombre 'a' no está definido
La 'a', tal como se define en el alcance de f(), no está disponible fuera de su alcance, es decir, en run123(). Pero el gráfico predeterminado tiene que hacer referencia a ellos con algo, de modo que se pueda hacer referencia al gráfico predeterminado, según sea necesario, en varios ámbitos y ahí es cuando su nombre resulta útil.