Image TensorFlow:读取队列中的图像而无需洗牌
我有一个614张图片的训练集,已经被洗牌了。我想按5个批次的顺序读取图像。因为我的标签是按相同的顺序排列的,所以当读取到批中时,任何图像的混乱都会导致不正确的标签 以下是我的函数,用于读取图像并将其添加到批处理中:Image TensorFlow:读取队列中的图像而无需洗牌,image,queue,tensorflow,Image,Queue,Tensorflow,我有一个614张图片的训练集,已经被洗牌了。我想按5个批次的顺序读取图像。因为我的标签是按相同的顺序排列的,所以当读取到批中时,任何图像的混乱都会导致不正确的标签 以下是我的函数,用于读取图像并将其添加到批处理中: # To add files from queue to a batch: def add_to_batch(image): print('Adding to batch') image_batch = tf.train.batch([image],batch_si
# To add files from queue to a batch:
def add_to_batch(image):
print('Adding to batch')
image_batch = tf.train.batch([image],batch_size=5,num_threads=1,capacity=614)
# Add to summary
tf.image_summary('images',image_batch,max_images=30)
return image_batch
# To read files in queue and process:
def get_batch():
# Create filename queue of images to read
filenames = [('/media/jessica/Jessica/TensorFlow/StreetView/training/original/train_%d.png' % i) for i in range(1,614)]
filename_queue = tf.train.string_input_producer(filenames,shuffle=False,capacity=614)
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
# Read and process image
# Image is 500 x 275:
my_image = tf.image.decode_png(value)
my_image_float = tf.cast(my_image,tf.float32)
my_image_float = tf.reshape(my_image_float,[275,500,4])
return add_to_batch(my_image_float)
这是我执行预测的功能:
def inference(x):
< Perform convolution, pooling etc.>
return y_conv
这是我的主要职能:
def main ():
# Training
images = get_batch()
y_conv = inference(images)
loss = train_step(y_label,y_conv)
# To write and merge summaries
writer = tf.train.SummaryWriter('/media/jessica/Jessica/TensorFlow/StreetView/SummaryLogs/log_5', graph_def=sess.graph_def)
merged = tf.merge_all_summaries()
""" Run session """
sess.run(tf.initialize_all_variables())
tf.train.start_queue_runners(sess=sess)
print "Running..."
for step in range(5):
# y_1 = <get the correct labels here>
# Train
loss_value = sess.run(train_step,feed_dict={y_label:y_1})
print "Step %d, Loss %g"%(step,loss_value)
# Save summary
summary_str = sess.run(merged,feed_dict={y_label:y_1})
writer.add_summary(summary_str,step)
print('Finished')
if __name__ == '__main__':
main()
当我检查我的图像摘要时,图像似乎没有顺序。或者更确切地说,正在发生的是:
图像1-5:丢弃,图像6-10:读取,图像11-15:丢弃,图像16-20:读取等
所以看起来我两次得到我的批次,扔掉第一批,使用第二批?我试过一些补救办法,但似乎都不管用。我觉得调用images=get_batch and sess.run从根本上理解了一些错误。您的批处理操作是一个FIFOQueue,因此每次使用它的输出时,它都会提升状态
第一个session.run调用在计算train_步骤时使用图像1-5,第二个session.run请求计算图像_摘要,该摘要提取图像5-6并在可视化中使用它们
如果希望在不影响输入状态的情况下可视化内容,则可以将队列值缓存在变量中,并使用变量作为输入定义摘要,而不是依赖于实时队列
(image_batch_live,) = tf.train.batch([image],batch_size=5,num_threads=1,capacity=614)
image_batch = tf.Variable(
tf.zeros((batch_size, image_size, image_size, color_channels)),
trainable=False,
name="input_values_cached")
advance_batch = tf.assign(image_batch, image_batch_live)
现在你的图像批处理是一个静态值,你可以用它来计算损失和可视化。在两个步骤之间,您可以调用sess.runadvance\u batch来推进队列
使用这种方法会产生一些小问题-默认的保护程序会将您的image\u批处理变量保存到checkpoint。如果更改批大小,则检查点恢复将失败,因为维度不匹配。要解决此问题,您需要指定手动恢复的变量列表,并为其余变量运行初始值设定项。您使用的是什么版本的tensorflow?它能处理较少的图像吗?尝试使用batch=1Okay,因此基本上我只是错误地可视化了图像,但队列是正确的?我对图像进行可视化的唯一原因是确保队列是正确的。哈哈哈。因此,如果我删除我的tf.image_摘要,所有内容都应该正常工作,即使我无法通过可视化来验证这一点,除非我按照您上面的建议去做?非常感谢!另外一个问题,如果我调用y_conv,loss=sess.run[inference,train_step],feed_dict={y_label:y_1},那么将使用相同的image_批来计算y_conv和loss是否正确?是的,如果使用image_batch变量而不是live_image_批,那么所有计算都将使用相同的批
(image_batch_live,) = tf.train.batch([image],batch_size=5,num_threads=1,capacity=614)
image_batch = tf.Variable(
tf.zeros((batch_size, image_size, image_size, color_channels)),
trainable=False,
name="input_values_cached")
advance_batch = tf.assign(image_batch, image_batch_live)