参考:https://www.cnblogs.com/haifwu/p/12866319.html
补充:padding的四种填充方式
零填充,常数填充,镜像填充,复制填充
--------------------------------分割线----------------------------------
原文:
参考于https://blog.csdn.net/Vipbinn/article/details/82894863
研读代码时遇到 padding_type=‘reflect’ 时很不解,搜也没直接搜到结果,但看到TensorFlow中有关于pad函数的使用方法,想来都是填充,应该都是相通的,看完后豁然开朗!
tf.pad(
tensor, #被填充的张量
paddings, #填充的格式
mode='CONSTANT' #填充模式:"CONSTANT"、"REFLECT"、"SYMMETRIC"
name=None, #该操作张量的名称
constant_values=0 # 用于在"CONSTANT"模式下,设置的填充值。
)
例子说明:
文档的内容:
**# ‘t’ is [[1, 2, 3], [4, 5, 6]].
**# ‘paddings’ is [[1, 1,], [2, 2]].
**# ‘constant_values’ is 0.
**# rank of ‘t’ is 2.
pad(t, paddings, “CONSTANT”) ==> [[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 2, 3, 0, 0],
[0, 0, 4, 5, 6, 0, 0],
[0, 0, 0, 0, 0, 0, 0]]
pad(t, paddings, “REFLECT”) ==> [[6, 5, 4, 5, 6, 5, 4],
[3, 2, 1, 2, 3, 2, 1],
[6, 5, 4, 5, 6, 5, 4],
[3, 2, 1, 2, 3, 2, 1]]
pad(t, paddings, “SYMMETRIC”) ==> [[2, 1, 1, 2, 3, 3, 2],
[2, 1, 1, 2, 3, 3, 2],
[5, 4, 4, 5, 6, 6, 5],
[5, 4, 4, 5, 6, 6, 5]]
思路理解:
tf.pad的使用,第一个是填充0,后面两个是复制前几行或者列
[1,1],[2,2]
[1,1]指的是向上扩充一行,向下扩充一行
[2,2]指的是向左扩充2列,向右扩充2列
1.CONSTANT模式
按上下左右填充几行或者几列的0
paddings=[[1,1],[2,2]]的意思是向上填充一行0,向下填充一行0,向左填充二行0,向右填充两行0
向上填充一行0,变成
0,0,0
1,2,3
4,5,6
向下填充一行0
0,0,0
1,2,3
4,5,6
0,0,0
向左填充二行0
0,0,0,0,0
0,0,1,2,3
0,0,4,5,6
0,0,0,0,0
向右填充两行0
0,0,0,0,0,0,0
0,0,1,2,3,0,0
0,0,4,5,6,0,0
0,0,0,0,0,0,0
2.REFLECT模式
首先要定好边缘(可理解为对称轴),按边缘翻(边缘不复制)
比如刚开始
1, 2, 3
4, 5, 6
向上翻一行,以123为对称轴
4,5,6
1,2,3
4,5,6
向下翻一行,以4,5,6为对称轴
4,5,6
1,2,3
4,5,6
1,2,3
以列4,1,4,1为对称轴,向左翻二行
6,5,4,5,6
3,2,1,2,3
6,5,4,5,6
3,2,1,2,3
以列6,3,6,3为对称轴,向右翻2行
6,5,4,5,6,5,4
3,2,1,2,3,2,1
6,5,4,5,6,5,4
3,2,1,2,3,2,1
3.SYMMETRIC模式
类似的,唯一的区别是把边缘(也就是对称轴)也复制了,从对称轴开始复制
比如刚开始
1, 2, 3
4, 5, 6
向上翻一行,以123为对称轴,从对称轴开始复制
1,2,3
1,2,3
4,5,6
向下翻一行,以4,5,6为对称轴
1,2,3
1,2,3
4,5,6
4,5,6
以列1,1,4,4为对称轴,向左翻二行
2,1,1,2,3
2,1,1,2,3
5,4,4,5,6
5,4,4,5,6
以列3,3,6,6为对称轴,向右翻2行
2,1,1,2,3,3,2
2,1,1,2,3,3,2
5,4,4,5,6,6,5
5,4,4,5,6,6,5