2017-05-31 4 views
0

Ich habe 3 Warteschlangen, eine ist ein FileReader, der von einem string_input_producer geliefert wird, zwei sind slice_input_producer, die von einem Vektor von int32 bzw. einer Matrix von int32 gespeist werden. Sie sind alle so geordnet, dass sie beim sequentiellen Lesen ein Bild, eine Frage und eine Antwort liefern, die ein Beispiel bilden.Bewahren Sie Kohärenz beim Mischen von Warteschlangen in Tensorflow

Was ich tun möchte, ist sie mischen, während die Beziehungen zwischen ihnen erhalten.

Ich habe versucht, mit shuffle_batch, aber dies bewahrt nicht die Beziehungen - so dass es nutzlos.

Meine aktuellen Code (die entsprechenden Bits):

def load_images(self,images,q_name): 
    filename_queue = tf.train.string_input_producer(images,shuffle=False,name=q_name) 
    reader = tf.WholeFileReader() 
    key, value = reader.read(filename_queue) 
    imagedata = tf.image.decode_png(value) 
    imagedata = tf.cast(tf.image.resize_images(imagedata,[224,224],tf.image.ResizeMethod.NEAREST_NEIGHBOR),tf.float32) 
    imagedata = tf.div(imagedata,tf.reduce_max(tf.abs(imagedata))) 
    imagedata.set_shape([224,224,3]) 
    return key,imagedata 

keys[testfile],imagedata[testfile] = self.load_images(imagefiles[testfile],'test') 
keys[trainfile],imagedata[trainfile] = self.load_images(imagefiles[trainfile],'train') 

s_train_answer_batch,s_train_question_batch,s_train_image_batch = tf.train.batch([tf.train.slice_input_producer([answers[trainfile]],shuffle=False)[0],tf.train.slice_input_producer([questions[trainfile]],shuffle=False)[0],imagedata[trainfile]],batch_size=batch_size,capacity=batch_size*2,enqueue_many=False) 

feed_dict = {self.x_image:s_train_image_batch.eval(), self.x_question: s_train_question_batch.eval(), self.y_:s_train_answer_batch.eval(),self.keep_prob:keep_prob} 

_,ce, summary, image_summary, accuracy= sess.run([self.train_step,self.cross_entropy, self.summary_op, self.image_summary_op, self.accuracy],feed_dict=feed_dict) 

Also, um absolut klar zu sein: wenn das Bild, Frage und Matrizen beantworten, wo nur Vektoren der Zahlen von 1 bis 10, möchte ich würde das Futter Wörterbuch wie folgt aussehen:

q:[4,1,8,2,3,9,6,5,7],a:[4,1,8,2,3,9,6,5,7],i:[4,1,8,2,3,9,6,5,7] 

aber zur Zeit würden sie wie folgt aussehen:

q:[4,1,8,2,3,9,6,5,7],a:[7,3,1,5,6,2,4,9,8],i:[9,8,3,5,4,6,7,1,2] 

Antwort

0

Ich habe es gelöst! Verwenden Sie nicht .eval(), um die Ausgabe zu erhalten, rufen Sie sess.run ([image_batch, question_batch, answer_batch]) auf. Dies erhält die Reihenfolge und führt das Mischen durch. Ich habe keine Idee warum.

+0

Es sollte einen besseren Weg geben, dies zu tun. Sie sollten sess.run() nicht benötigen, um Ihre Beispiele zu erhalten. Und die Verwendung eines feed_dict vereitelt den Zweck des Lesers zusätzlich dazu, weniger effizient zu sein, da Sie Dinge aus dem Lesegerät heraus in das Feed-Diktat leiten, mehr Knoten zum Graphen hinzufügen und Daten mehrfach kopieren. Haben Sie versucht, dass die drei separaten Leser ein Bild/eine Frage/Antwort zurückgeben, und rufen Sie 'tf.train.shuffle_batch ([Bild, Frage, Antwort])' 'auf? Diese Funktion wird nicht dort sein, wo die Neuordnung stattfindet, sie sollte von früher kommen. – jpm

+0

Ich denke, vielleicht habe ich falsch kommuniziert, was ich getan habe. Um klar zu sein, sieht mein Code jetzt so aus: 'b_image, _question, b_answer = sess.run (s_train_answer_batch, s_train_question_batch, s_train_image_batch)' 'feed_dict = {self.x_image: b_image, self.x_question: b_question, self.y_: b_answe, self.keep_prob: keep_prob} ' – Amylizzle

+0

Nein, das ergab einen Sinn, aber es ist ineffizient. Sie sollten entweder eine feed_dict- oder eine Reader-Pipeline verwenden, nicht beide. Sie verlieren Zeit beim Kopieren von Daten aus der Batch-Funktion (beim Aufruf von sess.run) und in das feed_dict für jeden Batch. Die Stapelfunktion stellt die Eingabetensoren bereit, die anstelle von feed_dict in den Graphen eingefügt werden. Versuchen Sie auch, 'a_q = tf.train.slice_input_producer ([antwortet [trainfile], fragen [trainfile]], shuffle = False)'. Antwort a_q [0] und Frage a_q [1] sollte in der richtigen Reihenfolge sein, wenn die Tensoren "Antworten [Trainfile]" und "Fragen [Trainfile]" auch in der richtigen Reihenfolge sind. – jpm

0

Warum verwenden Sie keine einzige Warteschlange wie tf.train.range_input_producer mit shuffle, um eine Ganzzahl zu extrahieren, die für den Zugriff auf die verschiedenen Daten verwendet wird?

Mit anderen Worten, Sie verwenden eine einzige Warteschlange, um eine Ganzzahl zu extrahieren, mit der Sie alle drei Datenstrukturen indizieren.

+0

Ich kann die Bilder nicht in den Speicher laden und auf sie als Array zugreifen, weil es zu viele gibt und sie zu groß sind. Ich könnte möglicherweise die Bilder bis zur letzten Minute laden und das String-Array stattdessen indizieren, aber das wäre wesentlich langsamer, weil ich einen Stapel nicht vorher laden konnte. – Amylizzle

Verwandte Themen