Почему аргументы заполнения `tf.pad` нуждаются в дополнительном увеличении для точности? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь реализовать симметричный слой заполнения в Keras, что похоже на то, как это делает Caffe, и я столкнулся со странной проблемой.

Скажем, у нас есть 1x1280x1280x3 изображение с 3 каналов, и мы хотим выполнить свертку для него, чтобы он возвращал объект формы 1x320x320x96 с 96 каналами.В Caffe мы можем установить параметр pad прямо в слое свертки:

input: "image"
input_shape {
  dim: 1
  dim: 3
  dim: 1280
  dim: 1280
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "image"
  top: "conv1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 96
    kernel_size: 11
    pad: 5  # Padding parameter
    stride: 4
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}

Если вы попытаетесь скомпилировать это с Caffe, выходная форма conv1 будет действительно 1x320x320x96.


Теперь давайте попробуем то же самое с Keras, используя слой tf.pad и Lambda:

from keras.layers import Input, Lambda
import tensorflow as tf

image = Input(shape=(1280, 1280, 3),
                   dtype='float32',
                   name='image')
sym_pad = Lambda(lamda x: tf.pad(x, [[0, 0], [0, 5], [0, 5], [0, 0]]))  # padding = 5
conv1 = Conv2D(filters=96,
               kernel_size=11,
               strides=(4, 4),
               activation=relu,
               padding='valid',  # valid instead of 'same'
               name='conv1')(image)

Задача :

Если мы измеряемформа conv1, определенная из кода выше, будет 1x319x319x96 вместо 1x320x320x96.

Но если мы увеличиваем наш отступ с 2, поэтому вместо 5x5 используем 7x7, как здесь:

sym_pad = Lambda(lamda x: tf.pad(x, [[0, 0], [0, 5+2], [0, 5+2], [0, 0]]))  # padding = 7

conv1 будет иметь желаемую форму1x320x320x96, когда мы передаем ввод с добавлением image с формой 1x1287x1287x3 вместо 1x1285x1285x3 ( уведомление , что только нечетное заполнение на четном изображении изменяет форму свертки,это может быть связано с успехами).

Почему это происходит?Каффе автоматически увеличивает каждый параметр заполнения на 2?Или я что-то не так делаю?

Спасибо!

PS Мне известен параметр padding=same в слоях Keras, но я ищу симметричное заполнение вместо асимметричного.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

В вашем примере вы вводите ввод только снизу и справа.Используйте:

sym_pad = Lambda(lamda x: tf.pad(x, [[0, 0], [5, 5], [5, 5], [0, 0]]))

, чтобы получить тот же отступ, что и в Caffe.

0 голосов
/ 12 февраля 2019

Если вы говорите о симметричном заполнении, я предполагаю, что вы хотите добавить одинаковое количество пикселей к левой стороне изображения, а также к правой стороне (то же самое для верхней и нижней части).То, что вы делаете в настоящее время с tf.pad, это заполнение 5 пикселей вправо и 5 пикселей внизу.Поэтому вы дополняете 2,5 пикселя в обе стороны (теоретически).

Форма вывода задается как:

floor((input_size-kernel_size+2*padding_size)/stride_size) + 1

Так что в вашем случае при заполнении 2,5 пикселя это дает и форму вывода319. Если бы вы добавили 5 пикселей в обе стороны, то получили бы то, что ожидали бы, то есть 320.

...