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

#python #tensorflow #keras #deep-learning #conv-neural-network

#python #тензорный поток #keras #глубокое обучение #conv-нейронная сеть

Вопрос:

Это краткое изложение моей модели. введите описание изображения здесь

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

Я хочу, чтобы моя модель работала независимо от ширины ввода. Таким образом, размер ширины отображается как 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:

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

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

Комментарии:

1. Я обнаружил, что могу использовать output_padding для задания формы вывода. Не могли бы вы рассказать мне что-нибудь об этом или где я могу получить информацию об этом?

2. В keras.io/layers/convolutional/#conv2dtranspose вы можете взглянуть на конец документации, там есть формула, объясняющая, как на output_shape влияет шаг, размер ядра, заполнение и заполнение вывода. Вы также должны взглянуть на две статьи, связанные в качестве ссылок ниже.