首页 > 解决方案 > 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什么?

标签: pythontensorflowdeep-learning

解决方案


在许多实际用例中,没有区别。

例如,在一些 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) 输出。


推荐阅读