• TensorFlow2.0(4):填充与复制


    1 tf.pad()

          tf.pad()函数主要是用来对tensor的大小进行扩展,包括水平、垂直、深度(通道)等,方法定义如下:

          pad(tensor,paddings,mode="CONSTANT",name=None,constant_values=0)

    输入参数:

          tensor:输入的tensor

          paddings:设置填充的大小

          mode:填充方式,默认是CONSTANT,还有REFLECT和SYMMETRIC

          name:名称

          constant_values:CONSTANT填充方式的填充值,默认为0

          参数paddings必须是形状为(n,2)的一个list,这里的n是tensor的秩,也就是维度大小。例如当tensor为一个shape为(12,)的tensor时,paddings必须是形如[x,y]的一个list,x表示在第一维度前填充值的个数,y表示在第一维度后填充值的个数。

    import tensorflow as tf
    a = tf.range(1,13)
    a
    <tf.Tensor: id=3, shape=(12,), dtype=int32, numpy=array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12], dtype=int32)>
    tf.pad(a,[[3,0]])     # 3表示在第一维度前填充3个0,0表示不填充
    <tf.Tensor: id=5, shape=(15,), dtype=int32, numpy=
    array([ 0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
          dtype=int32)>

          当tensor是二维时,paddings必须是shape为(2,2)的list。

    a = tf.reshape(a,[3,4])
    a
    <tf.Tensor: id=9, shape=(3, 4), dtype=int32, numpy=
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]], dtype=int32)>
    tf.pad(a,[[1,1],[3,0]],constant_values=3)  # 在第一维度前后各填充一行,第二维度前填充两行,后不填充,填充值为3
    <tf.Tensor: id=12, shape=(5, 7), dtype=int32, numpy=
    array([[ 3,  3,  3,  3,  3,  3,  3],
           [ 3,  3,  3,  1,  2,  3,  4],
           [ 3,  3,  3,  5,  6,  7,  8],
           [ 3,  3,  3,  9, 10, 11, 12],
           [ 3,  3,  3,  3,  3,  3,  3]], dtype=int32)>

          对于3维tensor,paddings是一个shape为(3,2)的list。

    a = tf.reshape(a,[2,2,3])
    a
    <tf.Tensor: id=14, shape=(2, 2, 3), dtype=int32, numpy=
    array([[[ 1,  2,  3],
            [ 4,  5,  6]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]], dtype=int32)> 
    tf.pad(a,[[1,0],[1,1],[1,0]])  # 第一维度前填充1块数据,后不填充,第二维度前后各填充1行,第三维度前填充一列,后不填充
    <tf.Tensor: id=16, shape=(3, 4, 4), dtype=int32, numpy=
    array([[[ 0,  0,  0,  0],
            [ 0,  0,  0,  0],
            [ 0,  0,  0,  0],
            [ 0,  0,  0,  0]],
    
           [[ 0,  0,  0,  0],
            [ 0,  1,  2,  3],
            [ 0,  4,  5,  6],
            [ 0,  0,  0,  0]],
    
           [[ 0,  0,  0,  0],
            [ 0,  7,  8,  9],
            [ 0, 10, 11, 12],
            [ 0,  0,  0,  0]]], dtype=int32)>
    a = tf.range(1,13)
    a = tf.reshape(a,[3,4])
    a
    <tf.Tensor: id=22, shape=(3, 4), dtype=int32, numpy=
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]], dtype=int32)>

          当指定填充模式mode为'REFLECT'时,指的是以各维度边缘为对称轴进行填充(不包括边缘数据,也就是对称轴本身),且填充的规模不能大于该维度原有规模-1。

    tf.pad(a,[[2,1],[3,1]],mode='REFLECT')  # 对第二维度填充时,如果大于3就会产生异常,因为3已经可以把第二维度所有数据复制一遍
    <tf.Tensor: id=24, shape=(6, 8), dtype=int32, numpy=
    array([[12, 11, 10,  9, 10, 11, 12, 11],
           [ 8,  7,  6,  5,  6,  7,  8,  7],
           [ 4,  3,  2,  1,  2,  3,  4,  3],
           [ 8,  7,  6,  5,  6,  7,  8,  7],
           [12, 11, 10,  9, 10, 11, 12, 11],
           [ 8,  7,  6,  5,  6,  7,  8,  7]], dtype=int32)>

          SYMMETRIC填充模式与REFLECT填充模式一样,都是以边缘为对称轴进行赋值填充,不过SYMMETRIC模式会对对称轴进行赋值,所以指定的规模最大可以为原规模。

    tf.pad(a,[[2,1],[4,1]],mode='SYMMETRIC')  # 这时候对第二维度填充规模可以为4,但是超过4就会产生异常
    <tf.Tensor: id=26, shape=(6, 9), dtype=int32, numpy=
    array([[ 8,  7,  6,  5,  5,  6,  7,  8,  8],
           [ 4,  3,  2,  1,  1,  2,  3,  4,  4],
           [ 4,  3,  2,  1,  1,  2,  3,  4,  4],
           [ 8,  7,  6,  5,  5,  6,  7,  8,  8],
           [12, 11, 10,  9,  9, 10, 11, 12, 12],
           [12, 11, 10,  9,  9, 10, 11, 12, 12]], dtype=int32)>

    2 tile()

          tile()方法对指定维度进行复制,定义如下:

          tile(input,multiples,name=None):

          input:需要复制的tensor

          multiples:各维度需要复制的次数,0表示去除数据,1表示不复制,2表示复制一次

          参数multiples是一个长度与tensor的秩相等的list,例如当tensor的shape为(12,)时,multiples的shape也必须为只有一个元素的list,例如multiples=[2],表示对第一维度复制一次。

    a = tf.range(12)
    tf.tile(a,[2])
    <tf.Tensor: id=38, shape=(24,), dtype=int32, numpy=
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  0,  1,  2,  3,  4,
            5,  6,  7,  8,  9, 10, 11], dtype=int32)>

          当tensor的shape为(3,4)时,multiples是一个包含两个元素的list。

    a = tf.reshape(a,[3,4])
    tf.tile(a,[2,3])     # 第一维度复制1次,第二维度复制2次
    <tf.Tensor: id=42, shape=(6, 12), dtype=int32, numpy=
    array([[ 0,  1,  2,  3,  0,  1,  2,  3,  0,  1,  2,  3],
           [ 4,  5,  6,  7,  4,  5,  6,  7,  4,  5,  6,  7],
           [ 8,  9, 10, 11,  8,  9, 10, 11,  8,  9, 10, 11],
           [ 0,  1,  2,  3,  0,  1,  2,  3,  0,  1,  2,  3],
           [ 4,  5,  6,  7,  4,  5,  6,  7,  4,  5,  6,  7],
           [ 8,  9, 10, 11,  8,  9, 10, 11,  8,  9, 10, 11]], dtype=int32)>

          当tensor的shape为(2,2,3)时,multiples是一个包含3个元素的list。

    a = tf.reshape(a,[2,2,3])
    tf.tile(a,[2,1,2])
    <tf.Tensor: id=48, shape=(4, 2, 6), dtype=int32, numpy=
    array([[[ 0,  1,  2,  0,  1,  2],
            [ 3,  4,  5,  3,  4,  5]],
    
           [[ 6,  7,  8,  6,  7,  8],
            [ 9, 10, 11,  9, 10, 11]],
    
           [[ 0,  1,  2,  0,  1,  2],
            [ 3,  4,  5,  3,  4,  5]],
    
           [[ 6,  7,  8,  6,  7,  8],
            [ 9, 10, 11,  9, 10, 11]]], dtype=int32)>
  • 相关阅读:
    e552. 取Applet的参数
    e551. 精简的Applet
    e558. 在Applet中多图片交互显示
    e1087. try/catch语句
    e1086. if/else语句
    e1087. 用For循环做数组的遍历
    e1084. 捕获错误和异常
    Zookeeper 应用程序
    Zookeeper API
    Java并发编程:volatile关键字解析
  • 原文地址:https://www.cnblogs.com/chenjin2018/p/13756640.html
Copyright © 2020-2023  润新知