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]))
и заполнение не используется.