python - conv2d(SAME) 和 tf.pad + conv2d(VALID) 有什么区别?
问题描述
我几乎是新手tensorflow
,当我tensorflow
通过一些教程学习时,我已经阅读了以下代码:
if stride == 1:
return slim.conv2d(inputs, num_outputs, kernel_size, stride=1, padding='SAME', scope=scope)
else:
pad_total = kernel_size - 1
pad_beg = pad_total // 2
pad_end = pad_total - pad_beg
inputs = tf.pad(inputs, [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]])
return slim.conv2d(inputs, num_outputs, kernel_size, stride=stride, padding='VALID', scope=scope)
但是,我也了解到,“SAME”填充意味着输出数据与输入数据具有相同的大小,而“VALID”意味着不同,并且tf.pad
也是手动填充零的方法,所以这两种方法有什么区别? 或者这样做的目的是tf.pad
什么?
解决方案
在许多实际用例中,没有区别。
例如,在一些 imagenet 架构中,我们经常用 1 填充,然后进行 3x3 卷积。如果您首先使用 1 进行零填充,然后进行卷积,或者使用“相同”填充进行卷积,则网络的行为将是相同的。
但是,在非标准情况下,行为会有所不同。请记住,您可以在卷积层定义内核大小、步幅和膨胀率。
conv2d(SAM) 和对称 tf.pad +conv2d(VALID) 之间存在差异的反例:
输入:(7,7,1) 内核:(4,4) 步幅:(2,2)
这里的 conv2d(SAME) 与 tf.pad(0 pixel left/top, 1 pixel right/bottom) 相同,并且会产生 (3,3,1) 输出。
推荐阅读
- reactjs - 用建议反应搜索组件,如何选择建议
- reactjs - material-ui-popup-state 更改按钮颜色
- c++ - 避免 C++ 中部分虚构的表达式的 NAN
- c# - 如何对 IdentityServer4 管道实施业务特定规则?
- xamarin - 蓝牙设备名称在 Xamarin 表单中使用蓝牙 LE 返回 null
- json - Flutter 将自定义堆叠对象转换为 json
- c++ - 代码出乎意料地给出了一个无限循环
- node.js - Nodemon 服务器无法启动
- r - 如何使用 R 中的计数函数(如 NROW)过滤 mutate() 中的数据?
- python - 具有来自用户的多个原始输入的测试功能