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.
2 respuestas
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.
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)
Preguntas relacionadas
Nuevas preguntas
tensorflow
TensorFlow es una biblioteca de código abierto y una API diseñada para el aprendizaje profundo, escrita y mantenida por Google. Use esta etiqueta con una etiqueta específica del idioma ([python], [c ++], [javascript], [r], etc.) para preguntas sobre el uso de la API para resolver problemas de aprendizaje automático. Los lenguajes de programación que se pueden usar con la API de TensorFlow varían, por lo que debes especificar el lenguaje de programación. Especifique también el área de aplicación, como [detección de objetos].