填充(padding),在矩阵的周围补0操作,一般用于进行卷积操作之前,使得每个输入像素都能作为卷积核窗口的中心。
函数形式:
tf.pad( tensor,paddings, mode='CONSTANT',name=None,constant_values = 0 )
参数解释:
tensor:要填充的张量;
padings:代表每一维填充多少,它的维度和tensor的维度一样;
此操作根据您指定的 paddings 来填充一个 tensor,paddings 是一个具有形状 [n, 2] 的整数张量,其中 n 是 tensor 的秩,对于每个输入维度 D,paddings [D, 0] 表示在该维度的 tensor 内容之前要添加多少个值,而 paddings[D, 1] 表示在该维度中的 tensor 内容之后要添加多少值。
输出维度D的大小:
paddings[D, 0] + tensor.dim_size(D) + paddings[D, 1]
参数解释:
mode:可以取三个值,分别是"CONSTANT"、“REFLECT”、“SYMMETRIC”;
mode=“CONSTANT” 填充0;
mode="REFLECT" 映射填充,上下(1维)填充顺序和paddings是相反的,左右(零维)顺序补齐;
mode="SYMMETRIC" 对称填充,上下(1维)填充顺序是和paddings相同的,左右(零维)对称补齐;
name:操作的名称(可选);
constant_values:在 “CONSTANT” 模式下,要使用的标量填充值,必须与 tensor 具有相同类型(可选)。
返回:
该函数返回一个张量,与 tensor 具有相同的类型。
实例:
输入图像format为:N*H*W*C(N:batch数量,H:高,W:宽,C:通道数)
def _fixed_padding(inputs, kernel_size):
pad_total = kernel_size - 1
pad_beg = pad_total // 2
pad_end = pad_total - pad_beg
padded_inputs = tf.pad(inputs, [[0, 0], [pad_beg, pad_end],[pad_beg, pad_end], [0, 0]], mode='CONSTANT')
return padded_inputs
input:4维,2*416*416*1
padding:[[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]],代表在每一个"维度"上填充多少行或多少列,“维度”和输入张量的“维度”一样,这里的“维度”是指比如输入inputs大小是2*416*416*1,就是4维,然后填充顺序也要保证有四维,即大概这种形状:[[ ,],[ ,],[ ,],[ ,]],然后第一行就对应输入inputs中的2(N)这个维度,第二行对应输入inputs中的416(H)这个维度,第三行对应输入inputs中的416(W)这个维度,第四行对应输入inputs中的1(C)这个维度。
假设kernel_size=3,则pad_beg = 1,pad_end = 1,填充顺序为[[0, 0], [1, 1], [1,1], [0, 0]],意义是:在batch=2这个维度,[0,0]表示头和尾填充行或列数为0,即不填充;在416(H)这个维度上,[1,1]表示头和尾分别都要填充,即最上面填充1行,最下面填充1行;在416(W)这个维度上,[1,1]表示头和尾分别都要填充,即最左边填充1列,最右边填充1列;在channel=1这个维度,[0,0]表示头和尾填充行或列数为0,即不填充。经过tf.pad()后,张量大小变为2*418*418*1(N*H*W*C)。
tensorflow卷积中的两种padding方式“SAME”和“VALID”:
padding后矩阵大小的两种计算公式:
padding=‘VALID:’[向上取整]
padding=‘same:’[向上取整]
W:输入图片大小W*W
F:卷积核大小F*F
S:步长stride
P:padding