美文网首页基础知识
不同的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://blog.csdn.net/sinat_29957455/article/details/8...

  • js中call和apply的区别

    调用函数时, call和apply传递参数的方式不同 以名为showHide的函数为例: call可以按照顺序传递...

  • iOS底层原理-源码探索的三种方式

    本文介绍以alloc函数为例,该函数位于哪个库,分析三种方式: 断点 + control + step into ...

  • Kotlin-构造函数

    1.Kotlin与Java构造函数常规写法对比,以自定义View为例 不同点: 1.1 Kotlin以constr...

  • 盒模型

    标准盒模型,以在 Chrome 中为例。  一个元素的真实宽度 = 2(margin + padding + bo...

  • Scrapy简单笔记(一)

    Python内置函数 zip() 介绍 对不同长度的列表使用zip函数,以最短的为例,在长列表中截取同短列表长度的...

  • 变长参数表函数的编写

    以实现函数 printf 的一个最简单版本为例,介绍如何以可移植的方式编写可处理变长参数表的函数。因为我们...

  • 使用反射修改属性

    以TestClass为例,首先需要获取对应的属性。 valueA是字段,valueB是属性,获取的方式不同。 获取...

  • SQL注入漏洞案例实践学习记录(2018.7-2018.8)

    一、SQL注入简述 SQL注入漏洞测试的方式总结 SQL注入常用的内置函数整理(以MySql为例) 二、测试环境&...

  • Thunk

    Thunk 在C和C++中函数调用一般是通过压栈的方式实现参数传递。函数的调用有很多种约定,以__cdecl为例[...

网友评论

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

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