El supervisor de TensorFlow evita la asignación de variables: el gráfico se finaliza y no se puede modificar

Este código funciona bien:

import tensorflow as tf x = tf.Variable(initial_value=0) with tf.Session() as session: print session.run(x.assign(1)) 

Pero este código falla:

 import tensorflow as tf x = tf.Variable(initial_value=0) supervisor = tf.train.Supervisor(logdir="/tmp") with tf.Session() as session: print session.run(x.assign(1)) 

La única diferencia es la tf.train.Supervisor de instancias de un tf.train.Supervisor . Tenga en cuenta que ni siquiera utilizamos el supervisor para crear una sesión gestionada.

El error es:

 python tf_supervisor_freeze.py Traceback (most recent call last): File "tf_supervisor_freeze.py", line 6, in  print session.run(x.assign(1)) File "/lib/python2.7/site-packages/tensorflow/python/ops/variables.py", line 522, in assign return state_ops.assign(self._variable, value, use_locking=use_locking) File "/lib/python2.7/site-packages/tensorflow/python/ops/gen_state_ops.py", line 47, in assign use_locking=use_locking, name=name) File "/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 491, in apply_op preferred_dtype=default_dtype) File "/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 702, in internal_convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) File "/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 110, in _constant_tensor_conversion_function return constant(v, dtype=dtype, name=name) File "/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 103, in constant attrs={"value": tensor_value, "dtype": dtype_value}, name=name).outputs[0] File "/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2286, in create_op self._check_not_finalized() File "/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2009, in _check_not_finalized raise RuntimeError("Graph is finalized and cannot be modified.") RuntimeError: Graph is finalized and cannot be modified. Process finished with exit code 1 

El error permanece si se tf.train.Supervisor(logdir="/tmp", summary_op=None, saver=None) para deshabilitar algunos de los servicios del supervisor.

Este problema fue planteado por alguien más en Github, pero no se proporcionó ninguna respuesta allí; la solicitud era plantear el problema en StackOverflow en su lugar. La única pregunta relevante de StackOverflow no parece abordar este caso específico.

Al igual que el error dice, no puede modificar el gráfico cuando se finaliza el gráfico.

RuntimeError (“El gráfico está finalizado y no se puede modificar.”)

Cuando ejecute este código tf.train.Supervisor() , el gráfico se finalizará. Puede verificar su código con la ruta /tensorflow/python/training/supervisor.py en tensorflow de la versión 1.0.

Y encontrarás esto:

 # The graph is not allowed to change anymore. graph.finalize() 

Entonces no puedes modificar la gráfica después de Supervisor() .

No puedo explicar por qué, pero he encontrado una solución alternativa. Esto funciona:

 import tensorflow as tf x = tf.Variable(initial_value=0) a = x.assign(1) supervisor = tf.train.Supervisor(logdir="/tmp") with tf.Session() as session: print session.run(a) 

Todo lo que se ha hecho es mover la creación de la operación de asignación antes de la creación del supervisor (es decir, a = x.assign(1) ). Parece que el supervisor realmente congela el gráfico, lo que impide que se creen o se usen con más precisión nuevas operaciones después de la creación del supervisor.

Una operación de asignación es una nueva operación en el gráfico. Si esa operación se define antes de la finalización del gráfico (incluso si se ejecuta más adelante), entonces está bien.

La ejecución de la operación asigna efectivamente un valor a la variable. Esto se puede hacer de manera segura después de la finalización del gráfico, ya que no cambia el gráfico.

La línea de fondo es: – declarar las operaciones antes de la finalización del gráfico – ejecutarlas después.