【问题标题】:Iterate a tensor over a None dimension in tensorflow在张量流中迭代一个无维度的张量
【发布时间】:2023-04-05 21:55:01
【问题描述】:

如果我有一个与批量大小对应的第一维度为 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)])

如何处理动态形状?

【问题讨论】:

  • 在 Mask_RCNN 的 repo 中有一个名为 batch_slice 的函数做同样的事情:github.com/matterport/Mask_RCNN/blob/master/mrcnn/utils.py#L801
  • 不要认为这是我的问题的解决方案,因为它需要一个批量大小,而在具有可变批量大小的动态形状的情况下,我没有这个批量大小

标签: python tensorflow deep-learning


【解决方案1】:

如果你真的想这样做,你可以使用tf.map_fn

否则你可以尝试直接处理原始张量(第一维=无)并在正确的轴上进行操作(无需循环)

【讨论】:

    【解决方案2】:

    在 Tensor Flow 中可以使用 tf.map_fn 和 tf.scan 对 None 进行迭代,但请确保在构建任何图形之前禁用 Eager Execution。

    可以使用:

    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() 会自动堆叠所有返回的张量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多