2017-11-06 5 views
0

Grundsätzlich habe ich eine Liste von Bildern zur Bearbeitung. Und ich muss nach dem Laden eine Vorverarbeitung (Datenerweiterung) machen, dann füttere den Hauptgraphen von TF. Derzeit arbeite ich mit einem angepassten Generator, der eine Liste von Pfaden erhält, ein Paar Tensoren (Bilder) liefert und über Platzhalter dem Netzwerk zuführt. Und die sequentielle Verarbeitung dauerte ~ 0.5s für jede Charge.Tensorflow: Wie benutze ich die "neue" Dataset API mit QueueRunner

Ich habe gerade die Dataset-API gelesen, die ich direkt mit der Funktion .from_generator() verwenden könnte, und ich könnte die .get_next() als Eingabe direkt verwenden.

Aber wie passt der QueueRunner in das Framework? Verwendet Dataset implizit queue + dequeue, um seine generator/get_next-Pipeline beizubehalten, oder erfordert es, dass ich danach explizit in eine FIFOQueue einspeise? Wenn die Antwort die spätere lautet, was ist die beste Vorgehensweise, um die Pipeline so zu trainieren, dass mehrere zufällige_Zufallsepochen trainiert und validiert werden? (Ich meine, wie viele DS/queueRunner muss ich pflegen, und wo stelle ich die Shuffle und Epochen)

Danke.

+0

Für das Training schaffe ich zwei Datensätze: eine für die Ausbildung und eine für die Validierung. Sie können die Epochen festlegen und die Daten mit der Dataset-API mischen. Ich brauchte nie einen QueueRunner. – Sunreef

+0

Ich hoffe, den QueueRunner zu verwenden, um Daten (CPU) zu verarbeiten und Netzwerk (GPU) gleichzeitig zu trainieren, um die CPU-Zeit zu verbergen. Es scheint, Dataset allein kann das nicht erreichen, oder? –

Antwort

1

Sie müssen den QueueRunner nicht verwenden, um Warteschlangen/Puffer zu haben, wenn Sie die Dataset-API verwenden. Es ist möglich, Warteschlangen/Puffer mithilfe der Dataset-API zu erstellen und Daten vorzuverarbeiten und gleichzeitig ein Netzwerk zu trainieren. Wenn Sie über ein Dataset verfügen, können Sie eine Warteschlange/einen Puffer erstellen, indem Sie entweder prefetch function oder shuffle function verwenden.

Weitere Informationen finden Sie unter official tutorial on the Dataset API. Hier

ist ein Beispiel der Verwendung eines Prefetch-Puffer mit Vorverarbeitung auf der CPU:

NUM_THREADS = 8 
BUFFER_SIZE = 100 

data = ... 
labels = ... 
inputs = (data, labels) 

def pre_processing(data_, labels_): 
    with tf.device("/cpu:0"): 
     # do some pre-processing here 
     return data_, labels_ 

dataset_source = tf.data.Dataset.from_tensor_slices(inputs) 
dataset = dataset_source.map(pre_processing, num_parallel_calls=NUM_THREADS) 

dataset = dataset.repeat(1) # repeats for one epoch 
dataset = dataset.prefetch(BUFFER_SIZE) 

iterator = tf.data.Iterator.from_structure(dataset.output_types, 
              dataset.output_shapes) 
next_element = iterator.get_next() 
init_op = iterator.make_initializer(dataset) 

with tf.Session() as sess: 
    sess.run(init_op) 
    while True: 
     try: 
      sess.run(next_element) 
     except tf.errors.OutOfRangeError: 
      break 
Verwandte Themen