当跨步大于内核大小时,Tensorflow将使用相同的填充

当跨步大于内核大小时,Tensorflow将使用相同的填充,tensorflow,convolution,cross-correlation,Tensorflow,Convolution,Cross Correlation,我遇到了一个奇怪的问题,试图将卷积算子的实现与tensorflow处理相同填充的实现进行比较 根据post,相同的填充计算如下: //n_i = input size for ith dimension //k_i = filter size in ith dimension //s_i = stride in ith dimension //p_i = total padding in the ith dimension if((n_i % s_i) == 0) p_i = max(

我遇到了一个奇怪的问题,试图将卷积算子的实现与tensorflow处理相同填充的实现进行比较

根据post,相同的填充计算如下:

//n_i = input size for ith dimension
//k_i = filter size in ith dimension
//s_i = stride in ith dimension
//p_i = total padding in the ith dimension

if((n_i % s_i) == 0)
    p_i = max(k_i - s_i, 0)
else
    p_i = max(k_i - (n_i % s_i), 0)
我正在运行一些随机测试,并通过以下tf(1.4.0)程序缩小了我的实现与tensorflow之间的不匹配:

由于滤波器为1x1,其值为1.0,因此很容易看出使用哪个输入元素来计算输出值:

Expected output is [[[[ 1.0]]]]
TF output is [[[[ 1.1]]]]
将填充更改为“VALID”将得到1.0的预期结果:

Expected output is [[[[ 1.0]]]]
TF output is [[[[ 1.1]]]]
或者,如果将步幅更改为(2x1),我们将得到输出[0]的预期结果:

// output size is now: (2x1)
Expected output is [[[[ 1.0 ]] [[ 1.2]]]]
TF output is [[[[ 1.0 ]] [[ 1.2]]]]

猜猜怎么回事?我唯一的想法是,实际的TF实现并没有防止填充计算变为负数,而是使用负数填充调用TF.pad(或类似的东西),结果实际上删除了输入的第一个元素,生成了新的(填充的)输入[0]=1.1.

我不知道这个特定问题的答案(我发现TensorFlow填充非常令人困惑,尽管我编写了一些代码来处理它!),但是这里有一个参考Conv2D实现,可能会有所帮助:
// output size is now: (2x1)
Expected output is [[[[ 1.0 ]] [[ 1.2]]]]
TF output is [[[[ 1.0 ]] [[ 1.2]]]]