tensorflow中的padding操作及其源码解释

tensorflow中的两种PADDING形式,效果图如下:

tensorflow中的padding操作及其源码解释_第1张图片

用一个3x3的网格在一个28x28的图像上做切片并移动

移动到边缘上的时候,如果不超出边缘,3x3的中心就到不了边界

因此得到的内容就会缺乏边界的一圈像素点,只能得到26x26的结果

而可以越过边界的情况下,就可以让3x3的中心到达边界的像素点

超出部分的矩阵补零

根据tensorflow中的conv2d函数,我们先定义几个基本符号

1、输入矩阵 W(old_height)×W(old_width),这里只考虑输入宽高相等的情况,如果不相等,推导方法一样,不多解释。

2、filter矩阵 F×F,卷积核

3、stride值 S,步长

4、输出宽高为 new_height、new_width

当然还有其他的一些具体的参数,这里就不再说明了。

我们知道,padding的方式在tensorflow里分两种,一种是VALID,一种是SAME,下面分别介绍这两种方式的实际操作方法。

1、如果padding = ‘VALID’

new_height = new_width = (W – F + 1) / S (结果向上取整)

实际的操作如下图所示,对于不够一个步长的像素,会直接丢弃。

tensorflow中的padding操作及其源码解释_第2张图片
也就是说,conv2d的VALID方式不会在原有输入的基础上添加新的像素(假定我们的输入是图片数据,因为只有图片才有像素),输出矩阵的大小直接按照公式计算即可。

"VALD": (13-6+1)/5 =1.6取整为2,与图示一致。“SAME“:13/5=2.6 取整为3,与图示一致。

2、如果padding = ‘SAME’  

 (SAME的效果是当stride=1时,保持输入输出的形状不变,stride=n(n!=1)时,通过如下的公式计算,自动补充需要的padding值,使输出的map最终的形状=W/S

输出的高度:new_height = W(old_height) / S (结果向上取整)

高度上需要pad的像素总数:

pad_needed_height = (new_height – 1)  × S + F - W

上方添加的像素数为:  pad_top = pad_needed_height / 2  (结果取整)

下方添加的像素数为:  pad_down = pad_needed_height - pad_top

以此类推,在宽度上需要pad的像素数和左右分别添加的像素数为:

输出宽度:new_width = W(old_width) / S   (结果向上取整)

宽度上需要添加的像素总数:pad_needed_width = (new_width – 1)  × S + F - W

左边添加的像素数:pad_left = pad_needed_width  / 2 (结果取整)

右边添加的像素数:pad_right = pad_needed_width – pad_left

下面是关于此操作的源码(Get2dOutputSizeVerbose函数的部分节选),以供参考

tensorflow中的padding操作及其源码解释_第3张图片

 参考:http://www.jianshu.com/p/05c4f1621c7e

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(tensorflow中的padding操作及其源码解释)