我有一个图像目录,以及一个单独的文件匹配图像文件名到标签.所以图像目录中有'train/001.jpg'等文件,标签文件如下:
train/001.jpg 1 train/002.jpg 2 ...
通过从文件名创建文件队列,我可以轻松地从Tensor Flow中的图像目录加载图像:
filequeue = tf.train.string_input_producer(filenames) reader = tf.WholeFileReader() img = reader.read(filequeue)
但我对如何将这些文件与标签文件中的标签结合起来感到茫然.看来我需要在每一步都访问队列中的文件名.有办法获得它们吗?此外,一旦我有文件名,我需要能够查找由文件名键入的标签.似乎标准的Python字典不起作用,因为这些计算需要在图中的每一步发生.
鉴于您的数据不是太大,您无法将文件名列表作为python数组提供,我建议您只使用Python进行预处理.创建文件名和标签的两个列表(相同顺序),并将它们插入randomshufflequeue或队列中,然后从中出列.如果你想要string_input_producer的"循环无限"行为,你可以在每个纪元的开头重新运行'enqueue'.
一个非常玩具的例子:
import tensorflow as tf f = ["f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8"] l = ["l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8"] fv = tf.constant(f) lv = tf.constant(l) rsq = tf.RandomShuffleQueue(10, 0, [tf.string, tf.string], shapes=[[],[]]) do_enqueues = rsq.enqueue_many([fv, lv]) gotf, gotl = rsq.dequeue() with tf.Session() as sess: sess.run(tf.initialize_all_variables()) tf.train.start_queue_runners(sess=sess) sess.run(do_enqueues) for i in xrange(2): one_f, one_l = sess.run([gotf, gotl]) print "F: ", one_f, "L: ", one_l
关键是当你这样做时,你有效地将文件名/标签对排入队列enqueue
,并且这些对由...返回dequeue
.