我遇到了一个奇怪的问题,试图将我的卷积运算符的实现与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。