繁体   English   中英

conv2d(SAME)和tf.pad + conv2d(VALID)有什么区别?

[英]What's the difference between conv2d(SAME) and 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这两种方法? 还是这个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像素,右/下1像素)相同,并会产生(3,3,1)输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM