Я пытаюсь реализовать симметричный слой заполнения в 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, но я ищу симметричное заполнение вместо асимметричного.