padding的用法

转载
1.podding='SAME'时,全0填充。

2.padding=“VALID”,不使用全0填充

原本书上的内容,一开始看的时候没注意,没仔细看,只是单纯的理解为padding为SAME就补0;为VALID就不补0;

后来看代码的时候感觉不对劲,后来找了一些资料,才醒悟过来

参考链接:http://blog.csdn.net/lilai619/article/details/72854560

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

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

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 (结果向上取整)

也就是说,conv2d的VALID方式不会在原有输入的基础上添加新的像素(假定我们的输入是图片数据,因为只有图片才有像素),输出矩阵的大小直接按照公式计算即可。

2、如果padding = ‘SAME’

new_height = new_width = W / 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的像素数和左右分别添加的像素数为

pad_needed_width = (new_width – 1)  × S + F - W

pad_left = pad_needed_width  / 2 (结果取整)

pad_right = pad_needed_width – pad_left

按照上面的计算方法,对于下面这几行,用2*2的filter去池化,全0填充,移动步长是2,对28*28*32的矩阵。用常规的思路,发现又要补0,又要池化,怎么会得到输出是14*14*32的结果呢?

其实这种思路是错的,首先应该去看参数的值是SMAE还是VALID,然后根据上面的公式直接去计算补0 的具体操作以及得到的输出矩阵的大小。

new_height = new_width = W / S (结果向上取整) 28/2=14

在高度上需要pad的像素数为

pad_needed_height = (new_height – 1)  × S + F - W (14-1)*2+2-28等于0,发现根本不需要补0的

根据上式,输入矩阵上方添加的像素数为

pad_top = pad_needed_height / 2  (结果取整)

下方添加的像素数为

pad_down = pad_needed_height - pad_top

————————————————

版权声明:本文为CSDN博主「accumulate_zhang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/accumulate_zhang/article/details/78359856

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容