【问题标题】:TensorFlow how to pad tensor with the edge valuesTensorFlow如何用边缘值填充张量
【发布时间】:2018-10-14 22:38:34
【问题描述】:

如何使用边缘值填充张量(尺寸为 WxHxC)?

例如:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

变成:

[1, 1, 2, 3, 3]
[1, 1, 2, 3, 3]
[4, 4, 5, 6, 6]
[7, 7, 8, 9, 9]
[7, 7, 8, 9, 9]

【问题讨论】:

    标签: python tensorflow padding


    【解决方案1】:

    作为补充,如果你想用opencv这样的复制模式填充图像,下面可以做到,dst_image是要填充的图像。而pad_h_up、pad_h_down、pad_w_left、pad_w_right是四个参数:

    def pad_replica(image_pad, up,down, left, right):
        paddings_up = tf.constant([[1, 0],[0,0],[0,0]])
        paddings_down = tf.constant([[0, 1],[0,0],[0,0]])
        paddings_left = tf.constant([[0, 0],[1,0],[0,0]])
        paddings_right = tf.constant([[0, 0],[0, 1],[0 ,0]])
        i = tf.constant(0)
        c = lambda i,pad_len,pad_mode, image: tf.less(i, pad_len)
        def body(i,pad_len,pad_mode,image):
            i = i+1
            image = tf.pad(image, pad_mode,"SYMMETRIC")
            return [i, pad_len,pad_mode, image]
        [_, _, _, image_pad_up] = tf.while_loop(c, body, \
                                              [i, up, paddings_up, image_pad])
        i = tf.constant(0)
        [_, _, _, image_pad_down] = tf.while_loop(c, body, [i, down,paddings_down, image_pad_up])
        i = tf.constant(0)
        [_, _, _, image_pad_left] = tf.while_loop(c, body, [i, left, paddings_left, image_pad_down])
        i = tf.constant(0)
        [_, _, _, image_pad_right] = tf.while_loop(c, body, [i, right,paddings_right, image_pad_left])
        i = tf.constant(0)
        return image_pad_right
    dst_image.set_shape([None, None, None])
    dst_image = pad_replica(dst_image,\
                 tf.cast(pad_h_up, tf.int32),\
                tf.cast(pad_h_down,tf.int32),\
                tf.cast(pad_w_left, tf.int32),\
                tf.cast(pad_w_right,tf.int32)
                )
    

    【讨论】:

      【解决方案2】:

      使用tf.pad() 和模式“SYMMETRIC” - 它会反映边缘上的值,但如果您只进行 1 次深度填充,则相当于重复边缘值。如果你需要更多的填充,你必须重复这个操作,但你可以指数级地进行(先是 1,然后是 2,然后是 4,等等)。此代码(已测试):

      import tensorflow as tf
      
      a = tf.reshape( tf.constant( range( 1, 10 ) ), ( 3, 3 ) )
      b = tf.pad( a, [ [ 1, 1 ], [ 1, 1 ] ], "SYMMETRIC" )
      
      with tf.Session() as sess:
          print( sess.run( b ) )
      

      输出:

      [[1 1 2 3 3]
      [1 1 2 3 3]
      [4 4 5 6 6]
      [7 7 8 9 9]
      [7 7 8 9 9]]

      根据需要。

      【讨论】:

      • 太棒了!谢谢! :)
      • 当然,不客气!添加了另一个句子来说明如果您需要更多填充,该怎么做。
      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多