¿Cuáles son las diferencias entre estas funciones?
tf.variable_op_scope(values, name, default_name, initializer=None)
Devuelve un administrador de contexto para definir una operación que crea variables. Este administrador de contexto valida que los valores dados son del mismo gráfico, garantiza que ese gráfico sea el gráfico predeterminado y aplica un ámbito de nombre y un ámbito variable.
tf.op_scope(values, name, default_name=None)
Devuelve un administrador de contexto para usar al definir una operación de Python. Este administrador de contexto valida que los valores dados son del mismo gráfico, asegura que ese gráfico es el gráfico predeterminado y empuja un ámbito de nombre.
tf.name_scope(name)
Contenedor para
Graph.name_scope()
usar el gráfico predeterminado. VerGraph.name_scope()
para más detalles.
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
Devuelve un contexto para el alcance variable. El alcance variable permite crear nuevas variables y compartir las ya creadas al tiempo que proporciona comprobaciones para no crear o compartir por accidente. Para obtener más información, consulte el Cómo de alcance variable, aquí solo presentamos algunos ejemplos básicos.
fuente
Respuestas:
Comencemos con una breve introducción al intercambio de variables. Es un mecanismo
TensorFlow
que permite compartir variables a las que se accede en diferentes partes del código sin pasar referencias a la variable.El método
tf.get_variable
se puede usar con el nombre de la variable como argumento para crear una nueva variable con dicho nombre o recuperar la que se creó anteriormente. Esto es diferente de usar eltf.Variable
constructor que creará una nueva variable cada vez que se llame (y potencialmente agregará un sufijo al nombre de la variable si ya existe una variable con dicho nombre).Es para el propósito del mecanismo de intercambio variable que se introdujo un tipo separado de alcance (alcance variable).
Como resultado, terminamos teniendo dos tipos diferentes de ámbitos:
tf.name_scope
tf.variable_scope
Ambos ámbitos tienen el mismo efecto en todas las operaciones, así como en las variables creadas usando
tf.Variable
, es decir, el ámbito se agregará como prefijo a la operación o al nombre de la variable.Sin embargo, el alcance del nombre es ignorado por
tf.get_variable
. Podemos ver eso en el siguiente ejemplo:La única forma de colocar una variable a la que se accede usando
tf.get_variable
un alcance es usar un alcance variable, como en el siguiente ejemplo:Esto nos permite compartir fácilmente variables en diferentes partes del programa, incluso dentro de diferentes ámbitos de nombre:
ACTUALIZAR
A partir de la versión r0.11,
op_scope
yvariable_op_scope
están en desuso y reemplazados porname_scope
yvariable_scope
.fuente
scope
método que efectivamente tiene unvariable_scope
?"variable_scope
vs.name_scope
Si uno crea una variable (de alguna manera contf.Variable
otf.get_variable
), me parece más natural que siempre podamos obtenerla si especificamos el alcance o su nombre completo. No entiendo por qué uno ignora el nombre del alcance mientras que el otro no. ¿Entiendes lo racional de este comportamiento extraño?Tanto variable_op_scope como op_scope ahora están en desuso y no deberían usarse en absoluto.
Con respecto a los otros dos, también 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:
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 TensorBoard. Si ejecuta esto, obtendrá lo siguiente:
Verá el patrón similar si abre TensorBoard (como ve que
b
está fuera delscope_name
rectangular):Esto te da la respuesta :
Ahora verá que
tf.variable_scope()
agrega un prefijo a los nombres de todas las variables (no importa cómo las cree), operaciones, constantes. Por otro lado,tf.name_scope()
ignora las variables creadastf.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
La misma documentación proporciona más detalles sobre cómo funciona Variable Scope y cuándo es útil.
fuente
Los espacios de nombres son una forma de organizar nombres para variables y operadores de manera jerárquica (por ejemplo, "scopeA / scopeB / scopeC / op1")
tf.name_scope
crea espacio de nombres para operadores en el gráfico predeterminado.tf.variable_scope
crea espacio de nombres para variables y operadores en el gráfico predeterminado.tf.op_scope
igual quetf.name_scope
, pero para el gráfico en el que se crearon las variables especificadas.tf.variable_op_scope
igual quetf.variable_scope
, pero para el gráfico en el que se crearon las variables especificadas.Los enlaces a las fuentes anteriores ayudan a desambiguar este problema de documentación.
Este ejemplo muestra que todos los tipos de ámbitos definen espacios de nombres para variables y operadores con las siguientes diferencias:
tf.variable_op_scope
otf.variable_scope
son compatibles contf.get_variable
(ignora otros dos ámbitos)tf.op_scope
ytf.variable_op_scope
simplemente seleccione un gráfico de una lista de variables especificadas para crear un alcance. Aparte de su comportamiento igualtf.name_scope
y entf.variable_scope
consecuenciatf.variable_scope
yvariable_op_scope
agregue el inicializador especificado o predeterminado.fuente
Hagámoslo simple: solo utilízalo
tf.variable_scope
. Citando a un desarrollador de TF :Además del hecho de que
variable_scope
su funcionalidad básicamente extiende las dename_scope
, considere cómo no juegan tan bien juntos:Al apegarte
variable_scope
solo a evitar algunos dolores de cabeza debido a este tipo de incompatibilidad.fuente
En cuanto a API r0.11,
op_scope
yvariable_op_scope
ambos están en desuso .name_scope
yvariable_scope
se puede anidar:fuente
Puede pensarlos como dos grupos:
variable_op_scope
yop_scope
tomar un conjunto de variables como entrada y están diseñados para crear operaciones. La diferencia está en cómo afectan la creación de variables contf.get_variable
:observe el nombre de la variable
v
en los dos ejemplos.lo mismo para
tf.name_scope
ytf.variable_scope
:Puede leer más sobre el alcance variable en el tutorial . Se hizo una pregunta similar antes sobre Stack Overflow.
fuente
Desde la última sección de esta página de la documentación de tensorflow: nombres de operaciones en
tf.variable_scope()
fuente
Respuesta compatible con Tensorflow 2.0 : Las explicaciones de
Andrzej Pronobis
ySalvador Dali
están muy detalladas sobre las funciones relacionadasScope
.De las funciones de alcance discutidas anteriormente, que están activas a partir de ahora (17 de febrero de 2020) son
variable_scope
yname_scope
.Especificamos las llamadas compatibles 2.0 para esas funciones, discutimos anteriormente, para el beneficio de la comunidad.
Función en 1.x :
tf.variable_scope
tf.name_scope
Función respectiva en 2.x :
tf.compat.v1.variable_scope
tf.name_scope
(tf.compat.v2.name_scope
si migró de1.x to 2.x
)Para obtener más información sobre la migración de 1.xa 2.x, consulte esta Guía de migración .
fuente