Ядра четного размера с ОДНОМ ВСЕМ дополнением в Tensorflow - PullRequest
0 голосов
/ 02 июля 2018

В Tensorflow SAME padding стремится создать выходной сигнал того же размера, что и вход, с шагом = 1, заполняя ввод нулями в зависимости от ситуации. Для ядра нечетного размера, например, такого как 5x5, он помещает центр ядра (2,2) на первый пиксель ввода (0,0) и начинает сворачиваться. Как в координатах x, так и в координатах x требуется 2 пикселя для заполнения нулями.

Что, если вместо этого используется четное ядро, например 6x6? У него не будет центра пикселя как фактического центра. Как VALID padding справляется с этим? Например, согласно свертке изображения с ядром четного размера в общей литературе по обработке изображений принято ставить еще один пиксель перед нулем, как, например, -3 -2 -1 0 1 2 в этом случае. Три пикселя будут попадать в область заполнения. Я ссылался на документы Tensorflow для этого, но не смог найти уточняющий ответ.

1 Ответ

0 голосов
/ 02 июля 2018

Как вы говорите, в документации, похоже, нет четкого указания. Глядя на источник ядра двумерной свертки ( conv_ops.cc ), комментарий объясняет:

// Total padding on rows and cols is
// Pr = (R' - 1) * S + (Kr - 1) * Dr + 1 - R
// Pc = (C' - 1) * S + (Kc - 1) * Dc + 1 - C
// where (R', C') are output dimensions, (R, C) are input dimensions, S
// is stride, (Dr, Dc) are dilations, (Kr, Kc) are filter dimensions.
// We pad Pr/2 on the left and Pr - Pr/2 on the right, Pc/2 on the top
// and Pc - Pc/2 on the bottom.  When Pr or Pc is odd, this means
// we pad more on the right and bottom than on the top and left.

Так что, кажется, вы получите один дополнительный отступ в правом столбце и нижнем ряду с ядрами четного размера. Мы можем посмотреть на один пример:

import tensorflow as tf

input_ = tf.ones((1, 10, 10, 1), dtype=tf.float32)
kernel = tf.ones((6, 6, 1, 1), dtype=tf.float32)
conv = tf.nn.conv2d(input_, kernel, [1, 1, 1, 1], 'SAME')
with tf.Session() as sess:
    print(sess.run(conv)[0, :, :, 0])

Выход:

[[16. 20. 24. 24. 24. 24. 24. 20. 16. 12.]
 [20. 25. 30. 30. 30. 30. 30. 25. 20. 15.]
 [24. 30. 36. 36. 36. 36. 36. 30. 24. 18.]
 [24. 30. 36. 36. 36. 36. 36. 30. 24. 18.]
 [24. 30. 36. 36. 36. 36. 36. 30. 24. 18.]
 [24. 30. 36. 36. 36. 36. 36. 30. 24. 18.]
 [24. 30. 36. 36. 36. 36. 36. 30. 24. 18.]
 [20. 25. 30. 30. 30. 30. 30. 25. 20. 15.]
 [16. 20. 24. 24. 24. 24. 24. 20. 16. 12.]
 [12. 15. 18. 18. 18. 18. 18. 15. 12.  9.]]

Действительно, похоже, что дополнительные нули добавляются справа и снизу.

...