转自: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,还有REFLECT和SYMMETRIC
- 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
网友评论