Автокодер Keras выдает неправильную форму - PullRequest
2 голосов
/ 25 апреля 2019

Я пытаюсь построить глубокий сверточный автоэнкодер в Keras, но он продолжает выводить неправильную форму.

Код:

def build_network(input_shape):
    input_input =  Input(shape=input_shape)

    #Encode
    x = Conv2D(16, (3, 3), activation='relu', padding = 'same')(input_input)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = MaxPooling2D((2, 2), padding='same')(x)

    #Decode
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D((2, 2))(x)
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D((2, 2))(x)
    x = Conv2D(16, (3, 3), activation='relu', padding='same')(x) 
    x = UpSampling2D((2, 2))(x)
    decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
    autoencoder = Model(input_input, decoded)
    return autoencoder


if __name__ == "__main__":
    print(build_network((1, 32, 32)).layers[-1].output)

Я ожидаю, что выходная форма будет такой же, как входная форма, но вместо этого (8, 32, 1) для (1, 32, 32)

1 Ответ

2 голосов
/ 25 апреля 2019

Попробуйте использовать print(build_network((32,32,1)).layers[-1].output).Или, если вы хотите использовать канал первым, чем вам нужно изменить модель следующим образом,

def build_network(input_shape):
    input_input =  Input(shape=input_shape)

    #Encode
    x = Conv2D(16, (3, 3), activation='relu', padding = 'same')(input_input)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = MaxPooling2D((2, 2), padding='same')(x)

    #Decode
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
    x = Conv2D(16, (3, 3), activation='relu', padding='same')(x) 
    decoded = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
    # decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
    autoencoder = Model(input_input, decoded)
    return autoencoder

if __name__ == "__main__":
    print(build_network((1, 32, 32)).layers[-1].output)

Поскольку в UpSampling2D по умолчанию используется "channel_last".

...