zoukankan      html  css  js  c++  java
  • tf.pad 用法说明

    回顾图像的卷积神经网络的计算,关于图像卷积前后大小改变的一个很重要的公式:输入:w1*h1*c1,卷积核的超参数:卷积核的数量:K;卷积核的大小:F;卷积的步长:S;卷积的零填充:P,卷积后的大小是多少呢?宽度:w2=(w1-F+2P)/S+1,高度同理,而通道数等于卷积核的数量K,所以卷积后图像的大小为:w2*h2*K。什么时候会用到P呢,就是当我们想要得到输出的大小,无法直接实现时,就会使用P来帮忙。

    在tensorflow中有专门的用来做填充的函数:tf.pad()。参考了https://blog.csdn.net/qq_40994943/article/details/85331327,作者:路上病人。如要转载望注明出处。


     二维tensor

     tf.pad( tensor,paddings, mode='CONSTANT',name=None) 

    输入参数:tensor是待填充的张量,

         paddings代表每一维填充多少行/列,它的维度一定要和tensor的维度是一样的,这里的维度不是传统上数学维度,如[[2,3,4],[4,5,6]]是一个2乘3的矩阵,但它依然是二维的,所以pad只能是[[1,2],[1,2]]这种。

           mode 可以取三个值,分别是"CONSTANT" ,“REFLECT”,“SYMMETRIC”。

           mode=“CONSTANT” 填充0

           mode="REFLECT"映射填充,上下(1维)填充顺序和paddings是相反的,左右(零维)顺序补齐

           mode="SYMMETRIC"对称填充,上下(1维)填充顺序是和paddings相同的,左右(零维)对称补齐

    这么听起来好复杂的样子,看看代码就懂了。

    代码一:

    t=[[2,3,4],[5,6,7]]
    print(tf.pad(t,[[1,2],[1,2]],"CONSTANT")))

    结果是:

    [[0, 0, 0, 0, 0, 0],
     [0, 2, 3, 4, 0, 0],
     [0, 5, 6, 7, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0]]

    注意维数paddings参数,首先输入的张量是一个二维的,所以填充后的张量也一定是二维的,同时思考一下一个二维的tensor给它周围填0,能怎么填呢?无外乎就是上下左右嘛,参数是一个2*2的列表,列表里的第一行[1,2]表示填充行,第一个数代表上面填充1行,第二个数代表下面填充2行,列表的第二行[1,2]就是用来填充列的,第一个数代表左边填充1列,第二个数代表右边填充2列。因为mode="constant"所以都填充0。

    代码二:

     t=[[2,3,4],[5,6,7]]
     print(tf.pad(t,[[1,1],[2,2]],"REFLECT")))

    结果是

    [[7, 6, 5, 6, 7, 6, 5],
    [4, 3, 2, 3, 4, 3, 2],
    [7, 6, 5, 6, 7, 6, 5],
    [4, 3, 2, 3, 4, 3, 2]]

    你一下就能懂这个例子主要是来说明当mode="reflect"时,如何填充张量,仔细看结果,能看出填充效果使得张量是相互交错的,没错reflect就是反射和辉映的意思,所以就是交相辉映。那么具体是如何实现的呢?(是为了方便理解记忆如下分析,具体是先填充列还是行,我也不知道....-_-!)张量首先是进行行的交错填充,填充的行数如上所说不再赘述,填充后的效果如下,

    [[5, 6, 7],
    [ 2, 3, 4],
    [ 5, 6, 7],
    [ 2, 3, 4]]

    然后再进行列的交错填充,最终就是填充运行后的结果了。

    代码三:

    t=[[2,3,4],[5,6,7]]
        print(tf.pad(t,[[1,1],[2,2]],"SYMMETRIC")))

    结果:

      [[3, 2, 2, 3, 4, 4, 3],
       [3, 2, 2, 3, 4, 4, 3],
       [6, 5, 5, 6, 7, 7, 6],
       [6, 5, 5, 6, 7, 7, 6]]

    不多说空话,直接分析,当mode="symmetric",这个单词的意思就是对称的意思,所以填充后的张量是能够上下对称,左右对称的。同上分析,先行后列。

    三维tensor

    但是当我们在实际代码中,我们通常是对一个batch的三维图像进行填充,但是我们并不会进行多的填充,仅仅是在三维图像中同时分别填充每一层,写代码时得注意到上面所说的paddings的维数一定要与张量的维数相等,所以我们的实际代码如下:

    padded_input = tf.pad(batch_input, [[0, 0], [1, 1], [1, 1], [0, 0]], mode="CONSTANT")

    paddings中除了关于图像的height,weight需要填充,其他参数用零代替。

  • 相关阅读:
    c#——树的深度,广度优先遍历与迭代器(IEnumerable<T>)的结合使用
    弱网下移动端网络连接处理策略
    弱网络环境下最优调度和优化传输层协议方案
    Wpf ToolTip 绑订
    minio配置
    使用本机映像优化 NET 桌面应用
    Linux内核内存管理:系统内存布局-内核空间和用户空间
    mysql 的 limit 与sql server 的 top n
    win 10 遇到某文件一直在占用导致无法关闭,或者去任务管理器找不到服务怎么办?具体解决
    sql server
  • 原文地址:https://www.cnblogs.com/happy-sir/p/11637824.html
Copyright © 2011-2022 走看看