Я использую Tensorflow 1.4.0
Tensorflow tf.image.resize_bilinear () имеет аргумент под названием «align_corners», и я путаюсь с поведением, когда мы устанавливаем его в False. В официальном документе говорится:
align_corners: необязательный bool. По умолчанию False. Если это правда, центры 4 угловых пикселей входного и выходного тензоров выравниваются, сохраняя значения в угловых пикселях. По умолчанию false.
Когда я использую tf.image.resize_bilinear () с align_corners = True в следующей программе:
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, все будет в порядке).