当Stride大于内核大小时,Tensorflow Conv2D SAME填充

时间:2017-11-15 03:28:17

标签: tensorflow convolution cross-correlation

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

根据this帖子,SAME填充计算如下:

//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之间的不匹配:

#input size: (3x1) values: [1.0, 1.1, 1.2]
#filter size: (1x1) values: [1.0]
#stride: (3x1)
#output size: (1x1)
import tensorflow as tf
import numpy as np

i = tf.constant((np.ones(3) + np.arange(3) * 0.1).reshape(1,3,1,1), dtype=tf.float32, name='input')
f = tf.constant(np.ones(1).reshape(1,1,1,1), dtype=tf.float32, name='filter')

conv = tf.nn.conv2d(input=i, filter=f, strides=(1,3,1,1), padding='SAME')
with tf.Session() as sess:
    out = sess.run(conv)
    print out

由于过滤器是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(或等效的东西),结果实际上删除了输入的第一个元素, new(填充)输入[0] = 1.1。

0 个答案:

没有答案