Как ведет себя tf.keras.layers.Conv2D с padding = 'same' и шагами> 1? - PullRequest
0 голосов
/ 17 декабря 2018

Я прочитал В чем разница между заполнением 'SAME' и 'VALID' в tf.nn.max_pool of tenorflow? , но это не соответствует моему эксперименту.

import tensorflow as tf

inputs = tf.random_normal([1, 64, 64, 3])
print(inputs.shape)
conv = tf.keras.layers.Conv2D(6, 4, strides=2, padding='same')
outputs = conv(inputs)
print(outputs.shape)

производит

(1, 64, 64, 3)
(1, 32, 32, 6)

.Однако, следуя приведенной выше ссылке, вы получите (1, 31, 31, 6), потому что нет никаких дополнительных значений вне диапазонов фильтра без заполнения.

Как ведет себя tf.keras.layers.Conv2D с padding = 'same' и шагами> 1?
Я хочу знать точный ответ и его доказательства.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

В тензорном потоке, для шага s и входного размера n, заполнение тем же дает:

⌈n / s⌉

или потолок входного размера, деленный на шаг.

0 голосов
/ 17 декабря 2018

Keras использует реализацию заполнения TensorFlow.Все подробности доступны в документации здесь и здесь .

Во-первых, рассмотрим схему дополнения 'SAME'.Подробное объяснение причин этого приведено в этих примечаниях .Здесь мы суммируем механику этой схемы заполнения.При использовании 'SAME', высота и ширина вывода вычисляются как:

out_height = ceil(float(in_height) / float(strides[1]))
out_width  = ceil(float(in_width) / float(strides[2]))

Общее заполнение, примененное по высоте и ширине, вычисляется как:

if (in_height % strides[1] == 0):
  pad_along_height = max(filter_height - strides[1], 0)
else:
  pad_along_height = max(filter_height - (in_height % strides[1]), 0)
if (in_width % strides[2] == 0):
  pad_along_width = max(filter_width - strides[2], 0)
else:
  pad_along_width = max(filter_width - (in_width % strides[2]), 0)

Наконец, заполнениевверху, внизу, слева и справа:

pad_top = pad_along_height // 2
pad_bottom = pad_along_height - pad_top
pad_left = pad_along_width // 2
pad_right = pad_along_width - pad_left

Обратите внимание, что деление на 2 означает, что могут быть случаи, когда отступы с обеих сторон (сверху вниз, справа налево) отключеныодин.В этом случае нижняя и правая стороны всегда получают один дополнительный отступной пиксель.Например, когда pad_along_height равен 5, мы дополняем 2 пикселя вверху и 3 пикселя внизу.Обратите внимание, что это отличается от существующих библиотек, таких как cuDNN и Caffe, которые явно указывают количество дополняемых пикселей и всегда дополняют одинаковое количество пикселей с обеих сторон.

Для схемы 'VALID' высота выводаи ширина вычисляются как:

out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width  = ceil(float(in_width - filter_width + 1) / float(strides[2]))

и заполнение не используется.

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