批次的TensorFlow图像操作

批次的TensorFlow图像操作,tensorflow,Tensorflow,TensorFlow中有许多图像操作用于在训练期间扭曲输入图像,例如tf.image.random\u flip\u left\u right(image,seed=None)和tf.image.random\u brightness(image,max\u delta,seed=None)和其他一些操作 这些函数用于单个图像(即具有形状[高度、宽度、颜色通道]的三维张量)。我如何使它们在一批图像上工作(即具有形状[批次、高度、宽度、颜色通道]的4-D张量) 一个工作的例子将不胜感激 可以在循环

TensorFlow中有许多图像操作用于在训练期间扭曲输入图像,例如
tf.image.random\u flip\u left\u right(image,seed=None)
tf.image.random\u brightness(image,max\u delta,seed=None)
和其他一些操作

这些函数用于单个图像(即具有形状[高度、宽度、颜色通道]的三维张量)。我如何使它们在一批图像上工作(即具有形状[批次、高度、宽度、颜色通道]的4-D张量)


一个工作的例子将不胜感激

可以在循环中调用映像操作并连接结果。例如:

transformed_images = []
for i in range(batch_size):
  transformed_images.append(tf.image.random_flip_left_right(image[i, :, :, :]))
retsult = tf.stack(transformed_images)

一种可能性是使用最近添加的函数将单个图像操作符应用于批处理的每个元素

result = tf.map_fn(lambda img: tf.image.random_flip_left_right(img), images)

这有效地构建了与构建相同的图形,但通过使用TensorFlow对循环的支持,它对于更大的批处理大小更为有效。

TLDR:您可以创建队列,为队列的单个元素定义读取和处理数据,而不是使用TF方法进行批处理

我不知道它是如何工作的,但如果您使用队列、创建批处理并使用tensorflow方法读取图像,您可以像处理单个图像一样处理批处理

我还没有在大型数据集上测试它,也不知道它有多好(速度、内存消耗等等)。现在最好自己创建批处理。

我在cifar10示例中看到了这一点。你可以在这里看到

  • 首先,他们使用
    tf.train.string\u input\u producer
    创建队列。您可以使用不同类型的队列。例如,我尝试对多个图像使用
    tf.train.slice\u input\u producer
    。你可以在这里读到
  • 然后对单个图像进行所有必要的操作。若他们只需要阅读,那个就是阅读。若他们想要处理图像,他们会裁剪图像并做其他事情。阅读说明见
    read\u cifar10
    。在
    失真的\u输入中处理
  • 它们根据参数将2的结果传递给
    tf.train.batch
    tf.train.shuffle\u batch
    ,并从
    inputs()
    扭曲的\u inputs()
    函数返回
  • 他们阅读它就像阅读图像,标签=cifar10。扭曲的输入()并执行以下工作。在这儿

  • 您可以使用tf.reverse在具有形状[批次、高度、宽度、通道]的4-D张量上模拟tf.image.random\u flip\u left\u right和tf.image.random\u flip\u up\u down

    random_number = tf.random_uniform([], minval=0, maxval=4, dtype=tf.int32)   
    random_batch_flip = tf.where(tf.less(tf.constant(2), random_number), tf.image.flip_left_right(batch), batch)
    

    参考资料:

    Up投票,感谢您的快速回答!我考虑过类似的事情,但我相信这会为批次中的每个图像的TensorFlow图添加ops,因此对于不同的批次大小不起作用。我想我可以为我需要的每一个批量大小建立一个图表,但它看起来相当混乱。另一个答案似乎是正确的方法。再次感谢。谢谢。它很有效!tf.image中的函数没有这个内置函数是有原因的吗?我在从tf.map\u fn()调用的单个函数preprocess()中对所有图像进行了扭曲。我相信这会导致所有图像的随机失真不同,因为map_fn()使用新的随机值重复调用preprocess()。请详细说明您的答案与另一个建议答案之间的差异,以及为什么map_fn()是更好的解决方案。我猜tf.map_fn()在运行时在图像上循环,所以它不会为批处理中的每个图像向图形中添加操作?谢谢。我这样做了,而且成功了。但是,现在的培训速度比不进行转换慢5倍,因此效率不高:-(一般来说,如果答案中包含对代码意图的解释,以及在不引入其他代码的情况下解决问题的原因,那么答案会更有帮助。