He implementado algunas inicializaciones de tensor como assigmnets en el gráfico de Tensowrflow. Al mismo tiempo, estas asignaciones deben llamarse en el orden correcto, porque unas usan resultados de otras. Si expongo los nodos de asignación al exterior, el usuario (yo también) debería ejecutarlos con una llamada de sesión

sess.run([assign1, assign2, ...])

En el orden correcto y puede equivocarse. ¿Puedo unir la secuencia de asignaciones en una sola operación y exponer solo la ejecución?

ACTUALIZACIÓN

Escribí este código y encontré que imprime ojo? ¿Por qué? Debería imprimir inits aleatorios de b, ¿no?

import tensorflow as tf

tf.reset_default_graph()

a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2))
c = tf.get_variable("c", shape=(2,2))

assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    sess.run([assign_c, assign_b])

    print(c.eval())

ACTUALIZACIÓN 2

El siguiente código muestra que no puedo controlar el orden de asignación con group :

import tensorflow as tf

tf.reset_default_graph()

a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2), initializer=tf.zeros_initializer)
c = tf.get_variable("c", shape=(2,2))

assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)

incorrect_init = tf.group(assign_b, assign_c)
correct_init = tf.group(assign_c, assign_b)

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    sess.run([incorrect_init])
    #sess.run([correct_init])

    print(c.eval())

El resultado es siempre

[[ 1.  0.]
 [ 0.  1.]]

Independientemente de que llame a correct_init o incorrect_init. ¿Por qué? ¿Cómo forzar el pedido?

1
Dims 11 oct. 2017 a las 13:26

2 respuestas

La mejor respuesta

El orden de las variables en una sola llamada sess.run no significa nada.

sess.run([assign1, assign2, ...])

Es equivalente a

sess.run([..., assign2, assign1, ...])

Lo que realmente importa es la relación entre los nodos que estás ejecutando.

En su ejemplo, la salida de c.eval() es ojo, porque:

  1. sess.run ([assign_c, assign_b]) invoca assign_c y assign_b.
  2. assign_b depende de a.
  3. assign_c depende de b.
  4. por lo que c depende de b que depende de a

Por lo tanto: -> resolver a primero.

1
nessuno 11 oct. 2017 a las 10:59

Puede usar tf.group para agrupar operadores. Tensorflow resolverá todas las dependencias si las hay.

ACTUALIZACIÓN

c <- assign_c =>
c <- b =>
c <- assign_b =>
c <- a

Incluso si omite el paso sess.run([assign_c, assign_b]).

ACTUALIZACIÓN 2 Si necesita mantener el orden de ejecución para 3 tensores u operadores independientes, puede hacerlo con control_dependencies, pero SOLO si no hay dependencias.

with tf.control_dependencies([first]):
    op1 = tf.no_op()
with tf.control_dependencies([op1, second]):
    op2 = tf.no_op()
with tf.control_dependencies([op2, third]):
    op3 = tf.no_op()

with tf.Session() as s:
    op3.aval()
1
Andrii 11 oct. 2017 a las 11:38