Как можно закодировать вход с помощью одной 2D свертки и применить противоположную 2D DeConv / Transposed Conv, чтобы вернуть то же измерение?

Я работаю над автоэнкодером, и у меня проблема с воспроизведением ввода того же размера. Если я использую операцию транспонированной свертки / деконволюции с теми же параметрами, у меня будет другой размер вывода, чем у исходного ввода. Для иллюстрации моей проблемы предположим, что наша модель состоит только из одной свертки (для кодирования ввода) и одной деконволюции (для декодирования закодированного ввода). Однако я не получил того же размера, что и введенный. Точнее, второе и третье измерение / ось 1 и ось 2 равны 16, а не так, как можно было бы ожидать: 15. Вот код:

    import tensorflow as tf
    input = tf.keras.Input(shape=(15, 15, 3), name="Input0")

        conv2d_layer2 = tf.keras.layers.Conv2D(filters=32, strides=[2, 2], kernel_size=[3, 3],
                                              padding='same',
                                              activation='selu', name="Conv1")

        conv2d_trans_layer2 = tf.keras.layers.Conv2DTranspose(filters=32, strides=[2, 2],
                                                             kernel_size=[3, 3], padding='same',
                                                             activation='selu', name="DeConv1")

        x_endcoded_1 = conv2d_layer2(input)
        x_reconstructed = conv2d_trans_layer2(x_endcoded_1)
        model = tf.keras.Model(inputs=input, outputs=x_reconstructed)

Результаты в следующей модели:

Use tf.where in 2.0, which has the same broadcast rule as np.where
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Input0 (InputLayer)          [(None, 15, 15, 3)]       0         
_________________________________________________________________
Conv1 (Conv2D)               (None, 8, 8, 32)          896       
_________________________________________________________________
DeConv1 (Conv2DTranspose)    (None, 16, 16, 32)        9248      
=================================================================
Total params: 10,144
Trainable params: 10,144

Как я могу воспроизвести свой исходный ввод, используя только эту транспонированную свертку? Это возможно?


person user3352632    schedule 15.07.2020    source источник


Ответы (1)


удаляя отступы с обоих, вы можете воспроизвести сопоставление

input = Input(shape=(15, 15, 3), name="Input0")

conv2d_layer2 = Conv2D(filters=32, strides=[2, 2], kernel_size=[3, 3],
                      activation='selu', name="Conv1")(input)

conv2d_trans_layer2 = Conv2DTranspose(filters=32, strides=[2, 2],
                                     kernel_size=[3, 3], 
                                     activation='selu', name="DeConv1")(conv2d_layer2)

model = Model(inputs=input, outputs=conv2d_trans_layer2)
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Input0 (InputLayer)          [(None, 15, 15, 3)]       0         
_________________________________________________________________
Conv1 (Conv2D)               (None, 7, 7, 32)          896       
_________________________________________________________________
DeConv1 (Conv2DTranspose)    (None, 15, 15, 32)        9248      
=================================================================

В общем, чтобы сделать это в более глубоких структурах, вам нужно поиграть с отступами, шагами и объединением.

в Интернете есть много хороших ресурсов, которые объясняют, как работает эта операция, и их применение в keras

Padding and Stride для сверточных нейронных сетей

Уровни пула для сверточных нейронных сетей

Как использовать UpSampling2D и Conv2DTranspose

person Marco Cerliani    schedule 16.07.2020