我对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
的目的是什么?
答案 0 :(得分:0)
在许多实词用例中,没有区别。
例如,在某些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)输出。