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
.
Esta pregunta ya tiene una respuesta aquí:
¿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 atf.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
.