我对Tensorflow中的SAME填充的理解是添加了填充,使得输出尺寸(宽度和高度)与输入尺寸相同。但是,这种理解只有在stride = 1时才有意义,因为如果stride> 1,那么输出尺寸几乎肯定会更低。
所以我想知道在这种情况下计算填充的算法是什么。是否只是添加了填充,以便过滤器应用于每个输入值,而不是在右边留下一些?
答案 0 :(得分:5)
有一个公式:
n'= floor((n + 2 * p-f)/ s + 1)
其中n'是输出大小,n是输入大小,p是填充,f是过滤器大小,s是步幅。
如果您使用带有步幅的SAME填充> 1,p将是可被s整除的最小数(n + 2 * p-f)。注意:p可以是十进制的,因为它将在图像的两边进行平均。
答案 1 :(得分:3)
Peter 的回答是正确的,但可能缺少一些细节。让我在上面加上。
Autopadding = SAME 表示:o = ceil(i/s),其中 o = 输出大小,i = 输入大小,s = 步幅。
另外,通用的输出大小公式是:
o = floor( (i + p - k) / s) + 1
其中新项是 p(填充)和 k,即有效内核大小 (包括扩张,如果禁用扩张,则仅包括内核大小)。
如果您开发该公式来求解 p,您将得到:
p_min = (o-1) s - i + k # i.e., when the floor is removed from the previous equation
p_max = o s - i + k - 1 # i.e., when the numerator of the floor % s is s-1
[p_min, p_max] 范围内的任何填充值 p 都将满足条件 o = ceil(i/s),这意味着对于步长 s,有 s 个满足公式的总解。
使用 p_min 作为填充是常态,因此您可以忽略所有其他 s-1 解决方案。
PS:这将适用于 1D,但对于 nD,只需为每个维度独立重复这些公式,即,
p_min[dimension_index] = (o[dimension_index]-1)s[dimension_index] - i[dimension_index] + k[dimension_index]
作为参考,这两个链接非常有用: