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需要填充,其他参数用零代替。

 

posted @ 2019-10-08 20:45  剪掉辫子的人  阅读(1934)  评论(0编辑  收藏  举报