¿Cómo funcionan las Sesiones de Capacitación Supervisadas?


Estoy tratando de entender la diferencia entre usar tf.Session y tf.train.MonitoredTrainingSession, y donde podría preferir uno sobre el otro. Parece que cuando uso este último, puedo evitar muchas "tareas" como inicializar variables, iniciar corredores de cola o configurar escritores de archivos para operaciones de resumen. Por otro lado, con una sesión de entrenamiento monitorizada, no puedo especificar el gráfico de cálculo que quiero usar explícitamente. Todo esto me parece bastante misterioso. ¿Hay alguna filosofía subyacente ¿detrás de cómo se crearon estas clases que no estoy entendiendo?

Author: Mr_and_Mrs_D, 2017-04-06

1 answers

No puedo dar algunas ideas sobre cómo se crearon estas clases, pero aquí hay algunas cosas que creo que son relevantes sobre cómo se podrían usar.

El tf.Session es un objeto de bajo nivel en la API de python TensorFlow mientras, como usted ha dicho, el tf.train.MonitoredTrainingSession viene con un montón de características útiles, especialmente útil en la mayoría de los casos comunes.

Antes de describir algunos de los beneficios de tf.train.MonitoredTrainingSession, permítanme responder a la pregunta sobre el gráfico utilizado por la sesión. Puede especificar el tf.Graph utilizado por el MonitoredTrainingSession usando un gestor de contexto with your_graph.as_default():

from __future__ import print_function
import tensorflow as tf

def example():
    g1 = tf.Graph()
    with g1.as_default():
        # Define operations and tensors in `g`.
        c1 = tf.constant(42)
        assert c1.graph is g1

    g2 = tf.Graph()
    with g2.as_default():
        # Define operations and tensors in `g`.
        c2 = tf.constant(3.14)
        assert c2.graph is g2

    # MonitoredTrainingSession example
    with g1.as_default():
        with tf.train.MonitoredTrainingSession() as sess:
            print(c1.eval(session=sess))
            # Next line raises
            # ValueError: Cannot use the given session to evaluate tensor:
            # the tensor's graph is different from the session's graph.
            try:
                print(c2.eval(session=sess))
            except ValueError as e:
                print(e)

    # Session example
    with tf.Session(graph=g2) as sess:
        print(c2.eval(session=sess))
        # Next line raises
        # ValueError: Cannot use the given session to evaluate tensor:
        # the tensor's graph is different from the session's graph.
        try:
            print(c1.eval(session=sess))
        except ValueError as e:
            print(e)

if __name__ == '__main__':
    example()

Así que, como usted dijo, los beneficios de usar MonitoredTrainingSession son que, este objeto se encarga de

  • inicializando variables,
  • corredor de cola de inicio, así como
  • configurando los escritores de archivos,

Pero también tiene el beneficio de hacer que su código sea fácil de distribuir, ya que también funciona de manera diferente dependiendo de si especificó el proceso en ejecución como maestro o no.

Por ejemplo, podría ejecutar algo como:

def run_my_model(train_op, session_args):
    with tf.train.MonitoredTrainingSession(**session_args) as sess:
        sess.run(train_op)

Que llamarías de una manera no distribuida: {[41]]}

run_my_model(train_op, {})`

O de forma distribuida (ver el documento distribuido para más información sobre las entradas):

run_my_model(train_op, {"master": server.target,
                        "is_chief": (FLAGS.task_index == 0)})

Por otro lado, el beneficio de usar el objeto raw tf.Session es que no tiene los beneficios adicionales de tf.train.MonitoredTrainingSession, lo que puede ser útil si no planea usarlos o si desea obtener más control (por ejemplo, sobre cómo se inician las colas).

EDITAR (según comentario): Para la inicialización de op, tendría que hacer algo como (cf. documento oficial: {[41]]}

# Define your graph and your ops
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_p)
    sess.run(your_graph_ops,...)

Para el QueueRunner, me gustaría remitirle al documento oficial donde encontrará ejemplos más completos.

EDIT2: {[41]]}

El principal concepto a entender para tener una idea de cómo funciona tf.train.MonitoredTrainingSession es la clase _WrappedSession:

Este wrapper se usa como clase base para varios wrappers de sesión que proporcionan funcionalidad adicional como como seguimiento, coordinación, y recuperación.

El tf.train.MonitoredTrainingSession funciona (a partir de versión 1.1) de esta manera:

  • primero comprueba si es un jefe o un trabajador (cf. el distribuido doc para la pregunta léxica).
  • Comienza los hooks que se han proporcionado (por ejemplo, StopAtStepHook solo recuperaría el tensor global_step en esta etapa.
  • Crea una sesión que es una Chief (o Worker sesión) envuelta en una _HookedSession envuelta en una _CoordinatedSession envuelto en un _RecoverableSession.
    Las Chief/Worker las sesiones se encargan de ejecutar los ops de inicialización proporcionados por Scaffold.
      scaffold: A `Scaffold` used for gathering or building supportive ops. If
    not specified a default one is created. It's used to finalize the graph.
    
  • La sesión chief también se ocupa de todas las partes de los puntos de control: por ejemplo, restaurar desde puntos de control usando el Saver desde el Scaffold.
  • El _HookedSession está básicamente ahí para decorar el método run: llama a los métodos _call_hook_before_run y after_run cuando es relevante.
  • En la creación el _CoordinatedSession construye un Coordinator que inicia los corredores de cola y será responsable de cerrarlos.
  • El _RecoverableSession se asegura de que hay reintento en caso de tf.errors.AbortedError.

En conclusión, el tf.train.MonitoredTrainingSession evita mucho código de placa de caldera mientras que es fácilmente extensible con el mecanismo de ganchos.

 23
Author: pfm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-05 17:25:43