我有3个队列,一个是由string_input_producer提供的FileReader,两个是slice_input_producers,分别由int32的向量和int32的矩阵提供。它们都是有序的,当按顺序阅读时,它们提供了形成一个例子的图像,问题和答案。
我想做的就是改变它们,同时保留它们之间的关系。
我尝试过使用shuffle_batch,但这并没有保留关系 - 这使它无用。
我当前的代码(相关位):
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)
所以,绝对清楚:如果图像,问题和答案矩阵中只有数字1到10的向量,我希望Feed字典看起来像:
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]
但目前他们看起来像是:
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]
答案 0 :(得分:0)
我解决了!不要使用.eval()来获取输出,调用sess.run([image_batch,question_batch,answer_batch])。这保留了排序并进行了改组。我不明白为什么。
答案 1 :(得分:0)
为什么不使用tf.train.range_input_producer
和shuffle
之类的单个队列来提取用于访问不同数据的整数?
换句话说,您使用单个队列来提取用于索引所有三个数据结构的整数。