理解tf.pad()及tensorflow卷积中的padding方式(“SAME”和“VALID”)

最近细看了一下yolov3的代码,对其中的填充语法小结一下,方便之后回顾复习。

首先说一下填充的作用:

       填充(即代码中的padding),就是在矩阵的周围补0,一般用于进行卷积操作之前,使得每个输入像素都能作为卷积核窗口的中心。

以下面这段代码为契机首先理解tf.pad():

def _fixed_padding(inputs, kernel_size):
    #这里的inputs format为'NHWC'
    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

一、tf.pad()理解:

参数解释:

inputs:要填充的输入张量,如yolov3网络中的输入图像format为:N*H*W*C(N:batch数量,H:高,W:宽,C:通道数),eg:2*416*416*1

第二个参数表示填充顺序:比如以上代码中的这种形式:[[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]],代表在每一个"维度"上填充多少行或多少列,“维度”和输入张量的“维度”一样,这里的维度可能与传统理解的维度不一样,这里的“维度”是指比如输入inputs大小是2*416*416*1,就是4维,然后填充顺序也要保证有四维,类似于一个二维矩阵,行数就是与输入inputs维度要相同,这里是4,列数固定就是2,即大概这种形状:[[ ,],[ ,],[ ,],[ ,]],然后第一行就对应输入inputs中的2这个维度,第二行对应输入inputs中的416(H)这个维度,第三行对应输入inputs中的416(W)这个维度,第四行对应输入inputs中的1这个维度。

mode:'CONSTANT',表示用0填充像素值,默认值

例子:比如这里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列;在1这个维度上,[0,0]表示头和尾填充行或列数为0,就是不填充

所以经过tf.pad()后,张量大小变为418*418(H*W)

 

二、tensorflow卷积中的两种padding方式“SAME”和“VALID”

padding = “SAME”时,输入和输出大小关系如下公式所示:

Noutput = Ninput / s  #输出大小等于输入大小除以步长向上取整,s是步长大小;

padding = “VALID”时,输入和输出大小关系如下公式所示:

Noutput = (Ninput - f + 1) / s  #输出大小等于输入大小减去滤波器大小加上1,最后再除以步长,f为滤波器的大小,s是步长大小

通用的输入特征图与输出特征图大小之间的关系:Noutput = (Ninput - f +2 * padding) / s + 1 #f为滤波器的大小,s是步长大小,padding是填充数,这个公式一般是已知padding数,来求输出特征图大小,与上面两个公式的区别:利用上面两个公式可计算出输出特征图大小,然后通过这个通用公式可计算出padding 0 的个数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值