在Tensorflow中改组队列时保持一致性

时间:2017-05-31 12:40:09

标签: python machine-learning tensorflow

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

2 个答案:

答案 0 :(得分:0)

我解决了!不要使用.eval()来获取输出,调用sess.run([image_batch,question_batch,answer_batch])。这保留了排序并进行了改组。我不明白为什么。

答案 1 :(得分:0)

为什么不使用tf.train.range_input_producershuffle之类的单个队列来提取用于访问不同数据的整数?

换句话说,您使用单个队列来提取用于索引所有三个数据结构的整数。