Hasta donde yo sé, Variable
es la operación predeterminada para hacer una variable, y get_variable
se usa principalmente para compartir peso.
Por un lado, hay algunas personas que sugieren usar en get_variable
lugar de la Variable
operación primitiva siempre que necesite una variable. Por otro lado, simplemente veo algún uso get_variable
en los documentos y demostraciones oficiales de TensorFlow.
Por lo tanto, quiero conocer algunas reglas generales sobre cómo usar correctamente estos dos mecanismos. ¿Hay algún principio "estándar"?
python
tensorflow
Lifu Huang
fuente
fuente
Respuestas:
Recomendaría usar siempre
tf.get_variable(...)
: facilitará la refactorización de su código si necesita compartir variables en cualquier momento, por ejemplo, en una configuración multi-gpu (vea el ejemplo CIFAR multi-gpu). No hay inconveniente en ello.Puro
tf.Variable
es de nivel inferior; en algún momentotf.get_variable()
no existía, por lo que algunos códigos todavía usan la forma de bajo nivel.fuente
tf.Variable
entf.get_variable
todas partes. Es entonces cuando quiero inicializar una variable con una matriz numpy, no puedo encontrar una manera limpia y eficiente de hacerlo como lo hago contf.Variable
. ¿Cómo lo resuelves? Gracias.tf.Variable es una clase, y hay varias formas de crear tf.Variable que incluyen
tf.Variable.__init__
ytf.get_variable
.tf.Variable.__init__
: Crea una nueva variable con initial_value .tf.get_variable
: Obtiene una variable existente con estos parámetros o crea una nueva. También puedes usar initializer.Es muy útil usar inicializadores como
xavier_initializer
:Más información aquí .
fuente
Variable
realidad me refiero a usar su__init__
. Comoget_variable
es tan conveniente, me pregunto por qué la mayoría del código TensorFlow que vi usar enVariable
lugar deget_variable
. ¿Hay algunas convenciones o factores a considerar al elegir entre ellos? ¡Gracias!tf.Variable()
podemos inicializarlo como un valor aleatorio de una distribución normal truncada. Aquí está mi ejemplow1 = tf.Variable(tf.truncated_normal([5, 50], stddev = 0.01), name = 'w1')
. ¿Cuál sería el equivalente de esto? ¿Cómo le digo que quiero una normal truncada? ¿Debo hacerw1 = tf.get_variable(name = 'w1', shape = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)
?tf.truncated_normal_initializer()
para obtener el resultado deseado.Puedo encontrar dos diferencias principales entre una y otra:
Primero es que
tf.Variable
siempre creará una nueva variable, mientras quetf.get_variable
obtiene una variable existente con parámetros específicos del gráfico, y si no existe, crea una nueva.tf.Variable
requiere que se especifique un valor inicial.Es importante aclarar que la función
tf.get_variable
antepone el nombre con el alcance de la variable actual para realizar verificaciones de reutilización. Por ejemplo:El último error de aserción es interesante: se supone que dos variables con el mismo nombre bajo el mismo alcance son la misma variable. Pero si prueba los nombres de las variables
d
ye
se dará cuenta de que Tensorflow cambió el nombre de la variablee
:fuente
d.name
ye.name
, acabo de venir a través de un documento en este TensorFlow tensor de operación de gráfico de denominación que lo explica:If the default graph already contained an operation named "answer", the TensorFlow would append "_1", "_2", and so on to the name, in order to make it unique.
Otra diferencia radica en que uno está en la
('variable_store',)
colección pero el otro no.Por favor vea el código fuente :
Déjame ilustrarte eso:
La salida:
fuente