Зачем использовать фиксированное заполнение при построении модели реснета в тензорном потоке

Tensorflow имеет официальную реализацию реснета в github. И он использует фиксированный отступ вместо обычного tf.layers.conv2d.

Что-то вроде этого:

def conv2d_fixed_padding(inputs, filters, kernel_size, strides, data_format):
  """Strided 2-D convolution with explicit padding."""
  # The padding is consistent and is based only on `kernel_size`, not on the
  # dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone).
  if strides > 1:
    inputs = fixed_padding(inputs, kernel_size, data_format)

  return tf.layers.conv2d(
      inputs=inputs, filters=filters, kernel_size=kernel_size, strides=strides,
      padding=('SAME' if strides == 1 else 'VALID'), use_bias=False,
      kernel_initializer=tf.variance_scaling_initializer(),
      data_format=data_format)

Какова цель этого? Мы можем получить карту функций 16x16, если введем изображение размером 32x32 и используем метод заполнения tf.layer.conv2d, установив значение SAME, шаг 2. Но в приведенном выше коде он добавит ноль с обеих сторон изображения, а затем использует заполнение. метод ДЕЙСТВИТЕЛЬНЫЙ.


person Keshawn Hsieh    schedule 11.12.2017    source источник
comment
Для сопоставления размеров во время свертки подробности ниже.   -  person Milind Deore    schedule 18.03.2018


Ответы (2)


Предположим, у нас есть шаг 2 и размер ядра 3.

Использование tf.layers.conv2d с дополнением SAME:

Дело 1:

                   pad|              |pad
       inputs:      0 |1  2  3  4  5 |0 
                   |_______|
                         |_______|
                               |_______|

Случай 2:

                                     |pad
       inputs:      1  2  3  4  5  6 |0 
                   |_______|
                         |_______|
                               |_______|

Вы можете видеть, что заполнение будет зависеть от размера ввода. Заполнение с одинаковым определяется таким образом, что выходной размер равен Math.ceil(input_size / stride). Подробнее об этом можно прочитать здесь.

Используя реализацию resnet с фиксированным заполнением:

Дело 1:

                   pad|              |pad
       inputs:      0 |1  2  3  4  5 |0 
                   |_______|
                         |_______|
                               |_______|

Случай 2:

                   pad|                 |pad
       inputs:      0 |1  2  3  4  5  6 |0 
                   |_______|
                         |_______|
                               |_______|

Заполнение однозначно определяется размером ядра и не зависит от входного размера.

person Martin Mihaylov    schedule 26.03.2018

Как вы знаете, в RNN есть пропускное соединение, где сеть выглядит следующим образом: введите здесь описание изображения

и уравнение становится следующим:

F(x) + x   // Here 'x' is not input but the the kernel/filter. 

Таким образом, с этим добавлением мы предполагаем, что размерность F(x) и x будет одинаковой. Но если это не так, мы должны дополнить их, чтобы произошла свертка.

По этой причине вы увидите padding="SAME" заполнение для всех сверток в Модель ResNet TF

person Milind Deore    schedule 17.03.2018
comment
Я думаю, вы неправильно поняли вопрос. Вопрос спрашивает, почему официальная модель tf пишет свою собственную операцию заполнения вместо использования параметра padding='SAME' tf.layers.conv2d, когда strides > 1 - person Adam; 20.03.2018
comment
Вам вообще не нужна вся функция conv2d_fixed_padding, если вместо padding=('SAME' if strides == 1 else 'VALID') используется padding='SAME' для получения того же измерения. - person Adam; 20.03.2018