Estoy confundida sobre el propósito de QueueRunner en tensorflow.

Al leer la documentación: https://www.tensorflow.org/programmers_guide/threading_and_queues

Estoy escribiendo mi propio código para cargar una muestra de mi base de datos personalizada y cargarla en una cola en tensorflow. He definido un FIFOQueue (manejo el orden de permutación) y el op enqueue apropiado.

El Coordinator tiene sentido, mi código lo usa para saber cuándo cerrar los hilos en cola. Pero el propósito de QueueRunner me confunde.

El QueueRunner ejecuta una operación enqueue repetidamente. Pero la documentación no habla sobre cómo alimentar datos a esa operación en cola.

Obviamente, una operación en cola requiere que la alimentes con alguna cosa. Entonces, QueueRunner solo debe usarse cuando estás carga desde registros de flujo de tensor (por ejemplo, todas las operaciones en cola son ellos mismos ops en el gráfico)?

Si la declaración anterior es correcta, entiendo (y desearía que la documentación fuera tan explícita). En ese caso, QueueRunner no es para mí usar en este caso porque todas las operaciones en cola no son operaciones gráficas. Si me equivoco, corrígeme.

1
David Parks 22 mar. 2017 a las 00:40

2 respuestas

La mejor respuesta

Después de pasar por esto varias veces, ahora entiendo el escenario y mi afirmación en la pregunta es correcta. QueueRunner solo ejecuta una operación TF en un bucle y se encarga del servicio de limpieza. Por lo tanto, cualquier operación de carga que se realice al 100% en el gráfico, como la lectura de un archivo de datos TF, se beneficiará de QueueRunner, pero si necesita cargar sus datos desde fuera del flujo de tensor, deberá escribir su propio hilo y bucle Poner en funcionamiento las operaciones usted mismo.

0
David Parks 11 abr. 2017 a las 16:19

Puedes hacerlo de esta manera:

def feed(images, labels, im, label, epochs=None):
    epochs_elapsed = 0
    while epochs is None or epochs_elapsed < epochs:
        for i in range(len(images)):
            yield {im: images[i], label: labels[i]}
        epochs_elapsed += 1


def tf_ops(images, labels, capacity=128):
    im = tf.placeholder(tf.float32,shape=(None,None,3))
    label = tf.placeholder(tf.int32,shape=())
    shapes = [(None,None,3), ()]
    queue = tf.PaddingFIFOQueue(capacity, [tf.float32, tf.int32],shapes=shapes)
    enqueue_op = queue.enqueue([im, label])
    fqr = FeedingQueueRunner(queue, [enqueue_op],
                             feed_fns=[feed(images, labels,im, label).next()])
    tf.train.add_queue_runner(fqr)
    return queue.dequeue()
source_im,source_label = tf_ops(source_images,source_labels)
1
charanReddy 14 oct. 2017 a las 01:35