美文网首页基础知识
不同的padding方式——以tf.pad()函数为例

不同的padding方式——以tf.pad()函数为例

作者: 红豆汤来两大碗 | 来源:发表于2019-10-19 17:10 被阅读0次

    转自:https://blog.csdn.net/sinat_29957455/article/details/80903913

    1、函数功能介绍

    tf.pad函数主要是用来对tensor的大小进行扩展,包括水平、垂直、深度(通道)等。
    pad(tensor, paddings, mode="CONSTANT", name=None, constant_values=0)
    输入参数:

    • tensor:输入的tensor
    • paddings:设置填充的大小
    • mode:填充方式,默认是CONSTANT,还有REFLECTSYMMETRIC
    • name:名称
    • constant_values:CONSTANT填充方式的填充值

    2、 实例

    paddings是一个大小为[n,2]的tensor,其中n为输入tensor的秩(维度)。

    a、CONSTANT填充方式(默认)

    import tensorflow as tf
    import numpy as np
     
    if __name__ == "__main__":
        a = np.array(np.arange(1,10))
        a = a.reshape((3,3))
        print(a)
        sess = tf.InteractiveSession()
        b = tf.pad(a,[[1,1],[2,2]])
        print(sess.run(b))
    

    输出

    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[0 0 0 0 0 0 0]
     [0 0 1 2 3 0 0]
     [0 0 4 5 6 0 0]
     [0 0 7 8 9 0 0]
     [0 0 0 0 0 0 0]]
    
    • paddings中的[1,1]表示的是垂直方向上的填充,第一个1表示的是向上的填充行数,第二个1表示的是向下的填充行数。
    • [2,2]表示的水平方向上的填充,第一个2表示的向左的填充行数,第二个2表示的是向右的填充行数。

    b、REFLECT填充方式

        b = tf.pad(a,[[1,1],[2,2]],"REFLECT")
        print(sess.run(b))
    

    输出

    [[6 5 4 5 6 5 4]
     [3 2 1 2 3 2 1]
     [6 5 4 5 6 5 4]
     [9 8 7 8 9 8 7]
     [6 5 4 5 6 5 4]]
    
    • REFLECT的填充方式使用的是一种通过对称轴进行对称复制的方式进行填充(复制时不包括对称轴),通过使用tensor边缘作为对称轴。
    • [1,1]中的第一个1表示的是,选择tensor的上边缘的第一行[1,2,3]作为对称轴,选择对称轴下面的第一行对称复制到上面也就是[4,5,6]。
    • [2,2]中的第一个2表示的是,选择tensor左边的第一行[4,1,4,7,4]作为对称轴,然后将右边的2行进行对称复制到对称轴的左边。

    注意: paddings中的参数填充函数,不能超过输入tensor在该方向上的shape-1,如上面的输入tensor的shape为(3,3),在使用REFLECT模式的时候,垂直方向和水平方向上都不能超过2。

    另一种方法,未验证
    nn.ReflectionPad2d()

    input = torch.randn(64, 3, 220, 220) # input size
    # 4-tuple
    pad = nn.ReflectionPad2d((3, 3, 5, 5)) # laft, right, top, bottom
    output = pad(input) # size(64, 3, 230, 226)
    # int
    pad = nn.ReflectionPad2d(3)
    output = pad(input) # size(64, 3, 226, 226)
    
    • 参数可以是指定一个值或者四元组

    c、SYMMETRIC填充方式

        b = tf.pad(a,[[1,1],[2,2]],"SYMMETRIC")
        print(sess.run(b))
    

    输出

    [[2 1 1 2 3 3 2]
     [2 1 1 2 3 3 2]
     [5 4 4 5 6 6 5]
     [8 7 7 8 9 9 8]
     [8 7 7 8 9 9 8]]
    
    • SYMMETRIC的填充方式于REFLECT填充方式类似,也是按照对称轴就是复制的,只是它包括对称轴。

    d、扩展——三维padding:

        a = np.array(np.arange(1,9))
        a = a.reshape((2,2,2))
        print(a)
        sess = tf.InteractiveSession()
        b = tf.pad(a,[[1,1],[2,2],[3,3]],constant_values=0)
        print(sess.run(b))
    

    输出

    [[[1 2]
      [3 4]]
    
     [[5 6]
      [7 8]]]
    [[[0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]]
     
     [[0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 1 2 0 0 0]
      [0 0 0 3 4 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]]
     
     [[0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 5 6 0 0 0]
      [0 0 0 7 8 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]]
     
     [[0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]
      [0 0 0 0 0 0 0 0]]]
    
    • paddings中的[1,1]表示的是深度方向上的填充,[2,2]表示的是垂直方向,[3,3]表示的是水平方向上的填充。

    2019-10-09

    相关文章

      网友评论

        本文标题:不同的padding方式——以tf.pad()函数为例

        本文链接:https://www.haomeiwen.com/subject/avegpctx.html