Деконволюционные слои в керасе - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь спроектировать архитектуру CNN в keras python.Я хочу преобразовать (для моего декодера) из слоя деконволюции 5 (512 фильтров с размером фильтра 4x4) в следующий уровень (используя deconvolution2D) и перейти к слою 6 деконволюции 128 фильтров с размером фильтра 7x7.Как я могу сделать эту деконволюцию?Я попробовал следующее:

d6 = Deconvolution2D(128, 5, 5, subsample=(2,2),  activation='relu',init='uniform', output_shape=(None, 128, 7, 7), border_mode='same')(d6)

Однако эта операция приводит к 128 фильтрам размером 8x8.Как можно вместо этого 7x7?

Я также пытаюсь перейти от (8x8) к (7x7), используя просто свертку, выбрав в качестве размера фильтра (3x3) и такое же количество фильтров:

d6 = Convolution2D(128, 3, 3,   activation='relu', border_mode='same')(d6)

Однако результат в конце снова тот же (128,8,8) вместо (128, 7, 7)

1 Ответ

0 голосов
/ 29 мая 2018

В первом случае проблема заключается в том, что вы используете четное число для subsample (в настоящее время «шагает») и нечетное число для размера изображения.

При subsample=(2,2) вы обязательно уменьшите вдвое размер изображения, поэтому обратная свертка обязательно удвоит размер изображения.Здесь вы ничего не можете сделать, если только вы не начнете работать с 8x8 или не удалите subsample.(Если вы начнете слишком много играть с комбинациями размера ядра, режима границы и подвыборки, вы можете достичь 7 x 7, но помимо запутанной математики, это может также создать несбалансированное изображение, больше слева или больше справаНапример, это может повлиять на результаты, когда ваши изображения такие маленькие)

Во втором случае результат такой же, потому что вы используете border_mode='same'.Но если вы удалите это, ваши размеры увеличатся с 8x8 до 6x6.Вам понадобится фильтр размером (2,2), чтобы потерять только один пиксель.


Предлагаю перейти на Керас 2.

Пример:

#but I suggest you remove the strides
d6 = Conv2DTranspose(128, (5,5), strides = (2,2), activation = 'relu', padding='same', kernel_initializer='uniform')

#'valid' is the default value, but I wrote it so you see the new name of "border_mode"
d6 = Conv2D(128,(3,3), activation='relu', padding='valid')(d6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...