2016-04-22 7 views
2

Ich habe einen Trainingssatz von 614 Bildern, die bereits gemischt wurden. Ich möchte die Bilder der Reihe nach in 5er-Schritten lesen. Da meine Etiketten in der gleichen Reihenfolge angeordnet sind, führt ein Verschieben der Bilder beim Einlesen in die Charge zu einer falschen Beschriftung.TensorFlow: Lesen von Bildern in der Warteschlange ohne Mischen

Das sind meine Funktionen zu lesen und die Bilder auf die Batch-Verarbeitung:

# To add files from queue to a batch: 
def add_to_batch(image): 

    print('Adding to batch') 
    image_batch = tf.train.batch([image],batch_size=5,num_threads=1,capacity=614) 

    # Add to summary 
    tf.image_summary('images',image_batch,max_images=30) 

    return image_batch 

# To read files in queue and process: 
def get_batch(): 

    # Create filename queue of images to read 
    filenames = [('/media/jessica/Jessica/TensorFlow/StreetView/training/original/train_%d.png' % i) for i in range(1,614)] 
    filename_queue = tf.train.string_input_producer(filenames,shuffle=False,capacity=614) 
    reader = tf.WholeFileReader() 
    key, value = reader.read(filename_queue) 

    # Read and process image 
    # Image is 500 x 275: 
    my_image = tf.image.decode_png(value) 
    my_image_float = tf.cast(my_image,tf.float32) 
    my_image_float = tf.reshape(my_image_float,[275,500,4]) 

    return add_to_batch(my_image_float) 

Diese meine Funktion ist die Vorhersage auszuführen:

def inference(x): 

    < Perform convolution, pooling etc.> 

    return y_conv 

Diese meine Funktion ist der Verlust zu berechnen und durchführen Optimierung:

def train_step(y_label,y_conv): 

    """ Calculate loss """ 
    # Cross-entropy 
    loss = -tf.reduce_sum(y_label*tf.log(y_conv + 1e-9)) 

    # Add to summary 
    tf.scalar_summary('loss',loss) 

    """ Optimisation """ 
    opt = tf.train.AdamOptimizer().minimize(loss) 

    return loss 

Das ist meine Hauptfunktion:

Wenn ich meine image_summary überprüfe, scheinen die Bilder nicht in der Reihenfolge zu sein. Oder besser gesagt, was passiert ist:

Bilder 1-5: verworfen, Bilder 6-10: lesen, Bilder 11-15: verworfen, Bilder 16-20: lesen usw.

So sieht es aus wie ich bekomme ich meine Chargen zweimal, werfe die erste weg und benutze die zweite? Ich habe ein paar Mittel ausprobiert, aber nichts scheint zu funktionieren. Ich habe das Gefühl, dass ich etwas grundsätzlich falsch verstehe, wenn ich images = get_batch() und sess.run() anrufe.

+0

Welche Version von Tensorflow verwenden Sie? Funktioniert es mit weniger Bildern? Versuchen Sie mit Batch = 1 – fabrizioM

Antwort

4

Ihre batch Operation ist eine FIFOQueue, so dass jedes Mal, wenn Sie es verwenden, es den Status vorrückt.

Ihr erster session.run Aufruf verwendet die Bilder 1-5 bei der Berechnung von train_step, Ihre zweiten session.run für die Berechnung von image_summary fragt die Bilder 5-6 und verwendet sie in der Visualisierungen zieht.

Wenn Sie Dinge visualisieren möchten, ohne den Status der Eingabe zu beeinflussen, können Sie Warteschlangenwerte in Variablen zwischenspeichern und Zusammenfassungen mit Variablen als Eingaben definieren, anstatt von der Warteschlange abhängig zu sein.

(image_batch_live,) = tf.train.batch([image],batch_size=5,num_threads=1,capacity=614) 

image_batch = tf.Variable(
    tf.zeros((batch_size, image_size, image_size, color_channels)), 
    trainable=False, 
    name="input_values_cached") 

advance_batch = tf.assign(image_batch, image_batch_live) 

So, jetzt Ihr image_batch ist ein statischer Wert, die Sie sowohl für die Berechnung Verlust und Visualisierung nutzen können. Zwischen den Schritten würden Sie sess.run(advance_batch) aufrufen, um die Warteschlange zu erweitern.

Geringfügige Falten mit diesem Ansatz - Standard-Sparer speichert Ihre image_batch Variable zum Prüfpunkt. Wenn Sie jemals die Stapelgröße ändern, schlägt die Wiederherstellung des Prüfpunkts fehl und die Dimension stimmt nicht überein. Zur Umgehung müssen Sie die Liste der manuell wiederherzustellenden Variablen angeben und Initialisierungen für den Rest ausführen.

+0

Okay, also im Grunde bin ich nur die Bilder falsch visualisiert, aber die Warteschlange ist richtig? Der einzige Grund, warum ich die Bilder visualisierte, war sicherzustellen, dass die Warteschlange überhaupt korrekt war. Hahaha. Deshalb, wenn ich meine 'tf.image_summary 'lösche, sollte alles richtig funktionieren, obwohl ich das nicht durch Visualisierung verifizieren kann, wenn ich nicht das mache, was Sie oben vorgeschlagen haben? Vielen Dank! – jlhw

+0

Zusätzliche Frage, ist es richtig, dass, wenn ich 'y_conv, Verlust = sess aufrufen.run ([folgerung, train_step], feed_dict = {y_label: y_1}) 'dann wird die gleiche' image_batch' verwendet, um 'y_conv' und' loss' zu berechnen? – jlhw

+0

Ja, wenn die Variable 'image_batch' anstelle von' live_image_batch' verwendet wird, werden alle Berechnungen denselben Batch verwenden –

Verwandte Themen