variable saving run python scope tensorflow

python - saving - tensorflow variable



¿Cuál es la diferencia entre variable_scope y name_scope? (3)

Cuando crea una variable con tf.get_variable lugar de tf.Variable , Tensorflow comenzará a verificar los nombres de los vars creados con el mismo método para ver si colisionan. Si lo hacen, se generará una excepción. Si creó una var con tf.get_variable e intenta cambiar el prefijo de sus nombres de variables utilizando el tf.name_scope contexto tf.name_scope , esto no impedirá que el Tensorflow genere una excepción. Solo el tf.variable_scope contexto tf.variable_scope cambiará efectivamente el nombre de su var en este caso. O si desea reutilizar la variable, debe llamar a scope.reuse_variables () antes de crear la var por segunda vez.

En resumen, tf.name_scope solo agrega un prefijo a todo el tensor creado en ese ámbito (excepto los vars creados con tf.get_variable ), y tf.variable_scope agrega un prefijo a las variables creadas con tf.get_variable .

¿Cuál es la diferencia entre variable_scope y name_scope ? El tutorial de alcance variable habla sobre variable_scope que abre implícitamente name_scope . También noté que crear una variable en un name_scope expande automáticamente su nombre con el nombre del ámbito también. ¿Entonces cuál es la diferencia?


Tuve problemas para comprender la diferencia entre variable_scope y name_scope (se veían casi iguales) antes de intentar visualizar todo creando un ejemplo simple:

import tensorflow as tf def scoping(fn, scope1, scope2, vals): with fn(scope1): a = tf.Variable(vals[0], name=''a'') b = tf.get_variable(''b'', initializer=vals[1]) c = tf.constant(vals[2], name=''c'') with fn(scope2): d = tf.add(a * b, c, name=''res'') print ''/n ''.join([scope1, a.name, b.name, c.name, d.name]), ''/n'' return d d1 = scoping(tf.variable_scope, ''scope_vars'', ''res'', [1, 2, 3]) d2 = scoping(tf.name_scope, ''scope_name'', ''res'', [1, 2, 3]) with tf.Session() as sess: writer = tf.summary.FileWriter(''logs'', sess.graph) sess.run(tf.global_variables_initializer()) print sess.run([d1, d2]) writer.close()

Aquí creo una función que crea algunas variables y constantes y las agrupa en ámbitos (según el tipo que proporcioné). En esta función también imprimo los nombres de todas las variables. Después de eso, ejecuto el gráfico para obtener valores de los valores resultantes y guardar archivos de eventos para investigarlos en el tensorboard. Si ejecuta esto, obtendrá lo siguiente:

scope_vars scope_vars/a:0 scope_vars/b:0 scope_vars/c:0 scope_vars/res/res:0 scope_name scope_name/a:0 b:0 scope_name/c:0 scope_name/res/res:0

Verá un patrón similar si abre TB (como ve que b está fuera del scope_name rectangular):

Esto te da la respuesta :

Ahora ve que tf.variable_scope() agrega un prefijo a los nombres de todas las variables (sin importar cómo las cree), operaciones, constantes. Por otro lado, tf.name_scope() ignora las variables creadas con tf.get_variable() porque supone que usted sabe qué variable y en qué ámbito desea usar.

Una buena documentación sobre Compartir variables le dice que

tf.variable_scope() : administra los espacios de nombres para los nombres pasados ​​a tf.get_variable() .

La misma documentación proporciona más detalles sobre cómo funciona Variable Scope y cuándo es útil.


tf.variable_scope es una evolución de tf.name_scope para manejar la reutilización de Variable . Como notó, hace más que tf.name_scope , por lo que no hay una razón real para usar tf.name_scope : no es sorprendente que un desarrollador de TF aconseje usar solo tf.variable_scope .

Comprendo que tf.name_scope todavía está por ahí es que hay incompatibilidades sutiles en el comportamiento de esos dos, lo que invalida tf.variable_scope como un reemplazo tf.name_scope para tf.name_scope .