tensorflow - neural - alimenta datos en un tf.contrib.data.Dataset como una cola
tensorflow python (1)
Acerca del uso de tf.contrib.data.Dataset
(de TensorFlow 1.2, consulte here y here ): la forma en que se obtienen los datos realmente no se ajusta a la forma en que los datos suelen obtenerse. En mi caso, tengo un hilo y recibo datos allí y no sé de antemano cuándo terminará, pero veo cuándo termina. Luego espero hasta que haya procesado todos los buffers y luego he terminado una época. ¿Cómo puedo obtener esta lógica con el Dataset
?
Tenga en cuenta que prefiero la interfaz Dataset
sobre la interfaz QueueBase
porque me da la interfaz del iterador que puedo reinicializar e incluso restablecer a un Dataset
diferente. Esto es más poderoso en comparación con las colas que no se pueden volver a abrir actualmente después de que se cierran (consulte here y here ).
Tal vez una pregunta similar, o la misma pregunta: ¿Cómo puedo envolver un Dataset
en una cola? Tengo un hilo con lecturas de algunos datos de algún lugar y que pueden alimentarlo y ponerlo en cola de alguna manera. ¿Cómo puedo obtener los datos en el Dataset
? Podría repetir algunas veces el tensor ficticio y luego usar el map
para devolver solo mi queue.dequeue()
pero eso realmente me lleva a todos los problemas originales con la cola, es decir, cómo reabrir la cola.
El nuevo método Dataset.from_generator()
permite definir un Dataset
alimentado por un generador de Python. (Para usar esta función en este momento, debe descargar una compilación nocturna de TensorFlow o compilarla usted mismo desde la fuente. Será parte de TensorFlow 1.4.)
La forma más sencilla de implementar su ejemplo sería reemplazar su subproceso de recepción con un generador, con pseudocódigo de la siguiente manera:
def receiver():
while True:
next_element = ... # Receive next element from external source.
# Note that this method may block.
end_of_epoch = ... # Decide whether or not to stop based on next_element.
if not end_of_epoch:
yield next_element # Note: you may need to convert this to an array.
else:
return # Returning will signal OutOfRangeError on downstream iterators.
dataset = tf.contrib.data.Dataset.from_generator(receiver, output_types=...)
# You can chain other `Dataset` methods after the generator. For example:
dataset = dataset.prefetch(...) # This will start a background thread
# to prefetch elements from `receiver()`.
dataset = dataset.repeat(...) # Note that each repetition will call
# `receiver()` again, and start from
# a fresh state.
dataset = dataset.batch(...)
Topologías más complicadas son posibles. Por ejemplo, puede usar Dataset.interleave()
para crear muchos receptores en paralelo.