我正在使用Tensorflow 1.4.0。
Tensorflow的tf.image.resize_bilinear()函数有一个叫做'align_corners'的参数,我对当我们将其设置为False时的行为感到困惑。在官方文档中,它说:
align_corners:可选布尔值。默认为False。如果为true,则输入和输出张量的4个角像素的中心对齐,保留角像素处的值。默认为false。
当我在下面这个程序中使用align_corners=True调用tf.image.resize_bilinear()时:
import tensorflow as tf
sess = tf.Session()
x = tf.Variable(tf.Variable([[[[1],[2]],[[3],[4]]]]))
pooling_output_size = [4, 4]
pool_output = tf.image.resize_bilinear(x, pooling_output_size,align_corners=True)
sess.run(tf.global_variables_initializer())
print pool_output.eval(session=sess)
它输出
[[[[1. ]
[1.3333334]
[1.6666667]
[2. ]]
[[1.6666667]
[2. ]
[2.3333335]
[2.6666667]]
[[2.3333335]
[2.6666665]
[3. ]
[3.3333335]]
[[3. ]
[3.3333333]
[3.6666667]
[4. ]]]]
哪些角落被正确地对齐。
然而,当我将align_corners设置为False时,我得到了以下奇怪的输出。
[[[[1. ]
[1.5]
[2. ]
[2. ]]
[[2. ]
[2.5]
[3. ]
[3. ]]
[[3. ]
[3.5]
[4. ]
[4. ]]
[[3. ]
[3.5]
[4. ]
[4. ]]]]
有人知道为什么Tensorflow会使用这种奇怪的实现方法吗?我在任何地方都没有找到解释。
实际上,PyTorch的双线性上采样也有align_corner参数,当你将其设为True时,它能很好地工作。但如果你将其设置为False,则它会执行不同于Tensorflow的行为。我现在完全困惑于它们的实现(也许只用align_corners=True就可以了)。