5

Tensorflow has a great deal of transformations that can be applied to 3D-tensors representing images ([height, width, depth]) like tf.image.rot90() or tf.image.random_flip_left_right() for example.

I know that they are meant to be used with queues hence the fact that they operate on only one image.

But would there be a way to vectorize the ops to transform 4D-tensor ([batch_size,height,width,depth]) to same size tensor with op applied image-wise along the first dimension without explicitely looping through them with tf.while_loop()?

(EDIT : Regarding rot90() a clever hack taken from numpy rot90 would be to do:

rot90=tf.reverse(x,tf.convert_to_tensor((False,False,True,False)))
rot90=tf.transpose(rot90,([0,2,1,3])

EDIT 2: It turns out this question has already been answered quite a few times (one example) it seems map_fn is the way to go if you want an optimized version. I had already seen it but I had forgotten. I guess this makes this question a duplicate...

However for random op or more complex op it would be nice to have a generic method to vectorize existing functions...)

Community
  • 1
  • 1
jeandut
  • 2,471
  • 4
  • 29
  • 56

1 Answers1

5

Try tf.map_fn.

processed_images = tf.map_fn(process_fn, images)
yuefengz
  • 3,338
  • 1
  • 17
  • 24
  • Thanks ! Looks promising ! – jeandut Nov 19 '16 at 10:05
  • I think, the `tf.map_fn` is not a vectorized operation. Underneath, it loops sequentially over the range. You may need to look at [tf.vectorized_map](https://www.tensorflow.org/api_docs/python/tf/vectorized_map) – Innat Mar 16 '22 at 23:24