2017-09-26 2 views
0

Ich versuche, ein Faltungsnetzwerk mit Tensorflow zu trainieren. Eingabe in die Faltungsschicht sind 3 Chaneel Color Images und die Ausgabe (Label) sind Single-Channel-Bilder. Ich verwende tfrecord und Warteschlangen. Die dequeue op ist unten angegebenDequeue heißt zwei Mal für Einzeltraining Batch

image, labelImage = queue.dequeue_many(BATCH_SIZE) 

Bild geht als Eingabe zu ersten Faltungsschicht und die labelImage verwendet Verlust zu berechnen.

conv1 = tf.layers.conv2d(inputs=img,filters=8,kernel_size=5,padding='SAME',activation=tf.nn.relu) 
..... 
..... 
finaldeconv = tf.layers.conv2d_transpose(inputs=deconv2,filters=1,kernel_size=5,strides=(2,2),padding='SAME',activation=tf.nn.relu) 
loss = tf.divide(tf.square(tf.subtract(labelImage,finaldeconv)),2) 
cost = tf.reduce_mean(loss) 

optimiser = tf.train.AdamOptimizer(LEARNING_RATE) 
train = optimiser.minimize(cost) 

Also, wenn ich jetzt trainieren innen Sitzung

sess.run(train) 

Die op fordert den obigen Code wie folgt sein sollte: -

Zug op Verlust op nennt. Verlust op ruft labeImage und finaldeconv finaldeconv KONV1 ruft KONV1 Bild

Bild und labelImage beide Anruf dequeop

I dont get Bild fordert konv Schicht und entsprechenden labelImage Verlust für die Berechnung. image und LabelImage führt separate Aufrufe von Deque aus. Wie kann ich das beheben?

Eine Möglichkeit besteht darin, Platzhalter zu verwenden und image und labelImage den Platzhaltern zuzuordnen, aber ich möchte keine Zeit beim Kopieren in GPU haben. Ich habe bereits die Warteschlange auf GPU.

Antwort

0

Bild und labelImage beide Anruf dequeop

Ja, die gleichedequeop, parallel.

Da Sie nicht explizit sind telefonisch unter (unter Verwendung verschiedener sess.run Anrufe) image oder labelImage, können Sie sicher sein, dass image & labelImage in Paar gehen.

Wenn Sie einen einzelnen sess.run Aufruf des train Betrieb mit aber Sie Labelwerte sind immer, die nicht korrekt für das Eingangsbild sind, ist das Problem woanders: vielleicht Ihr Verband Bildzeichen falsch ist oder Sie rufen sess.run(op1) und sess.run(op2), wobei op1image und op2 verwendet labelImage verwendet.

In diesem Zusammenhang ist image der "vorherige" Wert von Bildern und imageLabels sind die Bezeichnungen, die mit den tatsächlichen (und nicht bereits geholten) Bildern verbunden sind.

+0

Zunächst einmal danke für die Antwort. Ich möchte bestätigen, dass ich Ihre Antwort richtig verstanden habe. Ein Trainingsbeispiel, das in die Warteschlange eingefügt wird, ist im Listenformat ex [image, labelImage]. Ich habe create queue wie folgt: - queue = tf.RandomShuffleQueue (Kapazität = 100, min_after_dequeue = 2, dtypes = [ tf.float32, tf.float32], shapes = [(IMAGE_ROWS, IMAGE_COLS, 3), (IMAGE_ROWS, IMAGE_COLS)]) Wenn ich jetzt nur sess.run (train) anrufe, ruft es den dequeue op nur einmal an per iteration? Wenn ja, image und labelImage sind Paar und mein Problem wird gelöst. –

+0

ja, du hast es richtig verstanden – nessuno