2016-01-04 5 views
8

Ich war bei TensorFlow getting started guide for CNNWie erhält die Funktion "deformed_inputs()" im Beispiel-Tutorial TensorFlow CIFAR-10 128 Bilder pro Stapel?

nun im Zuge Funktion in cifar10_train.py das CIFAR-10 Beispiel gehe durch bekommen wir Bilder als

images,labels = cifar10.distorted_inputs() 

In der distorted_inputs() Funktion erzeugen wir die Dateinamen in eine Warteschlange und dann einen einzelnen Datensatz lesen als

# Create a queue that produces the filenames to read. 
filename_queue = tf.train.string_input_producer(filenames) 

# Read examples from files in the filename queue. 
read_input = cifar10_input.read_cifar10(filename_queue) 
reshaped_image = tf.cast(read_input.uint8image, tf.float32) 

Wenn ich de hinzufügen Fehlercode, die read_input Variable enthält nur 1 Datensatz mit einem Bild und seine Höhe, Breite und Bezeichnung.

Das Beispiel wendet dann eine Verzerrung auf das gelesene Bild/Datensatz an und übergibt es dann an die _generate_image_and_label_batch()-Funktion.

Diese Funktion gibt dann einen 4D Tensor der Form [batch_size, 32, 32, 3] mit batch_size = 128 zurück.

Die obige Funktion verwendet die Funktion tf.train.shuffle_batch(), wenn die Charge zurückgegeben wird.

Meine Frage ist, woher kommen die zusätzlichen Datensätze in der tf.train.shuffle_batch() Funktion? Wir geben keine Dateinamen oder Leserobjekte weiter.

Kann jemand etwas beleuchten, wie wir von 1 Rekord zu 128 Aufzeichnungen gehen? Ich habe in die Dokumentation geschaut, aber nicht verstanden.

+1

Ich hatte genau die gleiche Frage, froh, dass ich das gefunden –

Antwort

7

Die Funktion tf.train.shuffle_batch() kann verwendet werden, um einen oder mehrere Tensoren zu erzeugen, die einen Batch von Eingängen enthalten. Intern erstellt tf.train.shuffle_batch() eine tf.RandomShuffleQueue, auf der q.enqueue() mit den Bild- und Label-Tensoren aufgerufen wird, um ein einzelnes Element (Bild-Label-Paar) in die Warteschlange einzureihen. Es gibt dann das Ergebnis q.dequeue_many(batch_size) zurück, das batch_size zufällig ausgewählte Elemente (Bild-Label-Paare) in einen Stapel von Bildern und einen Stapel von Etiketten verkettet.

Beachten Sie, dass, obwohl es aus dem Code wie read_input und filename_queue eine funktionale Beziehung hat, gibt es eine zusätzliche Falte. Die einfache Auswertung des Ergebnisses tf.train.shuffle_batch() blockiert für immer, da der internen Warteschlange keine Elemente hinzugefügt wurden. Um dies zu vereinfachen, fügt TensorFlow beim Aufruf tf.train.shuffle_batch() eine einer internen Sammlung im Diagramm hinzu. Ein späterer Anruf an tf.train.start_queue_runners() (z. B. here in cifar10_train.py) wird einen Thread starten, der Elemente zu der Warteschlange hinzufügt und das Fortfahren des Trainings ermöglicht. Die Threading and Queues HOWTO hat mehr Informationen darüber, wie das funktioniert.

+0

Danke, Das räumte die Dinge viel auf. Die Warteschlangen funktionieren also so, als ob Sie zuerst einen Ablauf erstellen würden, wie die Dinge weitergehen und dann sagen Sie einfach GO zu den Threads und sie beginnen zu laufen und holen und arbeiten an den Daten, egal ob aus den Dateinamen, Datensätzen oder sonstwo. Denke ich richtig? – t0mkaka

+0

Das ist so ziemlich alles. (Die Warteschlangen-Runner haben auch eine gewisse Unterstützung, um Dinge sauber herunterzufahren, indem 'close()' -Aufrufe ausgelöst werden, wenn ein 'tf.OutOfRangeError' ausgelöst wird.) – mrry

+0

Dies ist ein großartiges Thema, aber ich bin immer noch verwirrt. Wie kann tf.train.start_queue_runners() oder tf.train.shuffle_batch() wissen, wie man die Dateien in der Warteschlange liest und wie man sie transformiert? Es scheint nicht, dass die Funktion "deformed_inputs()" jemals wieder aufgerufen wird - nur einmal, um ein Beispielbild zu erzeugen.Ich frage, weil ich den Code geändert habe, um aus PNG-Dateien und einem TXT mit Etiketten zu lesen. Es scheint die Bilder sequenziell zu lesen, liest aber nur das erste Etikett. – Rob

Verwandte Themen