Hasta donde yo sé, Variablees la operación predeterminada para hacer una variable, y get_variablese usa principalmente para compartir peso.
Por un lado, hay algunas personas que sugieren usar en get_variablelugar de la Variableoperación primitiva siempre que necesite una variable. Por otro lado, simplemente veo algún uso get_variableen 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.Variablees 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.Variableentf.get_variabletodas 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
Variablerealidad me refiero a usar su__init__. Comoget_variablees tan conveniente, me pregunto por qué la mayoría del código TensorFlow que vi usar enVariablelugar 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.Variablesiempre creará una nueva variable, mientras quetf.get_variableobtiene una variable existente con parámetros específicos del gráfico, y si no existe, crea una nueva.tf.Variablerequiere que se especifique un valor inicial.Es importante aclarar que la función
tf.get_variableantepone 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
dyese dará cuenta de que Tensorflow cambió el nombre de la variablee:fuente
d.nameye.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