#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
влияет шаг, размер ядра, заполнение и заполнение вывода. Вы также должны взглянуть на две статьи, связанные в качестве ссылок ниже.