Как я могу получить слой с тем же размером исходного ввода, используя Conv2DTranspose в Keras? - PullRequest
1 голос
/ 23 апреля 2019

Это резюме моей модели. enter image description here

Моя модель в основном похожа на сеть свертки.

Я хочу, чтобы моя модель работала независимо от ширины ввода. Таким образом, размер ширины выглядит как None.

и я подключил декодеры к моей модели, используя Conv2DTranspose.

Однако есть проблема.

Я ожидал, что результат от Conv2DTranspose будет того же размера, что и входные данные, но это не то же самое.

Я установил stride на 2, чтобы уменьшить количество параметров, а режим padding равен same, но я обнаружил проблему, когда размер нечетный.

Следующие функции использовались для операций свертки в ConvCapsuleLayer (custom layer).

conv = K.conv2d(input_tensor_reshaped, self.W, (self.strides, self.strides),
                    padding=self.padding, data_format='channels_last')

и я использовал Conv2DTranspose для декодера следующим образом.

recon_1 = layers.Conv2DTranspose(4, (5,5), strides=(2, 2), padding='same',  kernel_initializer='he_normal', name='decoder_1', activation='relu')(mask_layer)                
recon_2 = layers.Conv2DTranspose(8, (5,5), strides=(2, 2), padding='same',  kernel_initializer='he_normal', name='decoder_2', activation='relu')(recon_1)                
recon_3 = layers.Conv2DTranspose(1, (1,1), strides=(1, 1), padding='same',  kernel_initializer='he_normal', name='decoder_3', activation='linear')(recon_2)

Затем я получаю следующее сообщение об ошибке.

InvalidArgumentError (см. Выше для отслеживания): несовместимые фигуры: [1 200 824,1] против [1 200 823,1]

Как мне разрешить эту разницу, если размер нечетный?

1 Ответ

1 голос
/ 23 апреля 2019

Если вы используете последовательность понижающей дискретизации с коэффициентом 2 (из-за шага), за которой следуют деконволюции (Conv2DTranspose), умножающие размер на 2 (опять же до шага = 2), вы можете использовать только четные измерения.

Если вам абсолютно необходимы входные данные с нечетным измерением, вам придется либо использовать заполнение, либо выбросить одну строку.Вы также должны быть осторожны, если используете последовательные операции понижающей дискретизации (либо с шагами, либо с MaxPooling).Перед каждой операцией, уменьшающей размер, вы должны иметь размер, кратный коэффициенту понижающей дискретизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...