在这种情况下,我有一个张量,其第一个维度为None,与批次大小相对应,例如:
tensor = tf.placeholder(tf.float32, shape=[None, 256, 256,3],name="placeholder_input")
现在,我有一个张量函数“ myfunc”,作用在大小为[256,256,3]的张量上,我想对其应用与批处理次数相同的次数,从而得到大小为[None, 256,256,3]。如果形状不是动态的,我会简单地做:
output_tensor = tf.stack([myfunc(tensor [k,:,:,:] for k in range(BATCH_SIZE)])
我该如何处理动态形状?
答案 0 :(得分:0)
如果您确实想这样做,可以使用tf.map_fn
否则,您可以尝试直接处理原始张量(第一维=无)并在适当的轴上执行操作(无需循环)
答案 1 :(得分:0)
使用tf.map_fn和tf.scan在Tensor Flow中可以对None进行迭代,但是请确保在构建任何图形之前禁用急切的执行。
可以使用:
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
您可以执行以下操作:
tensor = tf.compat.v1.placeholder(dtype=tf.float32, shape=[None, 256, 256,3],name="placeholder_input")
output_tensor = tf.map_fn(lambda x : x, elems=(tensor))
输出:
<tf.Tensor 'map/TensorArrayV2Stack/TensorListStack:0' shape=(None, 256, 256, 3) dtype=float32>
此处不需要tf.stack,因为tf.map_fn()会自动堆叠所有返回的张量