如何解释 TensorFlow 中的卷积滤波器和步幅参数?

3

我正在努力理解TensorFlow的卷积,尤其是这个公式:

shape(output) = [batch,
             (in_height - filter_height + 1) / strides[1],
             (in_width - filter_width + 1) / strides[2],
             ...]

我会翻译成中文:
我本以为公式应该是
shape(output) = [batch,
             (in_height - filter_height) / strides[1] + 1,
             (in_width - filter_width) / strides[2] + 1,
             ...]

相比之下,如果从一个32x32像素的图像开始,并应用一个5x5的滤波器,步幅为[1,3,3,1],那么根据我的理解,这应该会产生一个10x10的输出。其值是对于区域进行卷积得到的。

 (0:4,0:4) ,  (0:4,3:7) ,  (0:4,6:10) , ...,  (0:4,27:31), 
 (3:7,0:4) ,  (3:7,3:7) ,  (3:7,6:10) , ...,  (3:7,27:31),
...
(27:31,0:4), (27:31,3:7), (27:31,6:10), ..., (27:31,27:31)

因此,两个维度都应该是floor((32-5)/3)+1=10,而不是floor((32-5+1)/3)=9。我在这里错过了什么?我是否误解了卷积的方式和/或参数的含义?如果是这样,我应该使用哪些参数才能获得上述选择?

2个回答

3
根据问题#196,文档的这部分显然是错误的;而且我认为dga的答案仍然存在问题。
应该是:
floor((in_height+y_padding-filter_height)/y_stride) + 1,
当padding = VALID时,y_padding = 0。
当padding = SAME时,通常应调整y_padding以使(in_height+y_padding-filter_height)/ y_stride成为整数,以便“floor”变得不必要。

2

你是正确的 - 应该是:

ceil(float(in_height - filter_height + 1) / float(strides[1]))

对于32、5和stride=3,这变成了: ceil(9.33) = 10。

已修复,并将很快推送到github。感谢您的指出!有关更多信息,请参见github bug讨论,问题#196


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接