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

时间:2015-11-16 15:04:27

标签: python filter convolution tensorflow

我正在尝试了解TensorFlow的convolution,特别是公式

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图像开始,并应用带有步幅[1,3,3,1]的5x5滤镜,然后根据我的理解,这应该产生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 个答案:

答案 0 :(得分:3)

根据issue #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'。

答案 1 :(得分:2)

你是正确的 - 它应该是:

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

对于32,5,stride = 3,这变为:ceil(9.33)= 10.

已修复并将很快推入github。谢谢你抓住这个!有关详细信息,请参阅github bug discussion, issue #196