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]
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
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
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