Как я могу сопоставить размер декодера кодировщика глубокого автоматического кодировщика?

Я кодирую очень простой глубокий автоматический кодировщик с набором данных MNIST, который имеет три слоя скрытого пространства. Однако есть проблемы с размерами кодировщика и декодера.

Точное сообщение об ошибке: ValueError: Ошибка при проверке ввода: ожидалось, что input_2 будет иметь форму (128,), но получил массив с формой (32,) в строке 60.

(строка 60: decoded_imgs = decoder.predict(encoded_imgs))

и я не знаю, как это решить. Я прикреплю свой полный код ниже. Пожалуйста помоги. Спасибо.

    from keras.layers import Input, Dense
    from keras.models import Model
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import mlab
    from matplotlib import pyplot as plt
    import sys
    np.set_printoptions(threshold=sys.maxsize)


    # encoding_dimensions
    encoding_dim = 128
    encoding_dim2 = 64
    encoding_dim3 = 32

    # input placeholder
    input_img = Input(shape=(784,))
    encoded = Dense(128, activation='relu')(input_img)
    encoded = Dense(64, activation='relu')(encoded)
    encoded = Dense(32, activation='relu')(encoded)

    decoded = Dense(64, activation='relu')(encoded)
    decoded = Dense(128, activation='relu')(decoded)
    decoded = Dense(784, activation='sigmoid')(decoded)

    print(encoded.shape)
    print(decoded.shape)

    autoencoder = Model(input_img, decoded)
    autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')


    encoder = Model(input_img, encoded)
    encoded_input = Input(shape=(encoding_dim,))


    decoder_layer = autoencoder.layers[-1]
    decoder = Model(encoded_input, decoder_layer(encoded_input))

    from keras.datasets import mnist
    (x_train, _), (x_test, _) = mnist.load_data()

    x_train = x_train.astype('float32') / 255.
    x_test = x_test.astype('float32') / 255.

    x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
    x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))

    print(x_test.shape)
    print(x_train.shape)

    autoencoder.fit(x_train, x_train,
                    epochs=1,
                    batch_size=256,
                    shuffle=True,
                    validation_data=(x_test, x_test))

    encoded_imgs = encoder.predict(x_test)
    decoded_imgs = decoder.predict(encoded_imgs)

    n=10
    plt.figure(num=2, figsize=(20, 3))
    for i in range(n):
        # input data
        ax = plt.subplot(2, n, i + 1)
        plt.imshow(x_test[i].reshape(28, 28))
        plt.gray()
        ax.get_yaxis().set_visible(False)
        ax.get_xaxis().set_visible(False)

        # recnstructed data
        ax = plt.subplot(2, n, i + 1 + n)
        plt.imshow(decoded_imgs[i].reshape(28, 28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    plt.show()

person Insung Lee    schedule 22.05.2020    source источник


Ответы (1)


Проблема связана с входным определением вашей модели decoder. Вы устанавливаете входные данные для модели декодера: encoded_input = Input(shape=(encoding_dim,)), где encoding_dim=128. Однако реальными входными данными для декодера являются выходные данные кодера размером 32 (количество нейронов в последнем Dense слое кодера). Вам нужно исправить объявление формы ввода в модели декодера, например:

encoded_input = Input(shape=(32,))

или режим вообще:

encoded_input = Input(shape=encoded.shape)
person alivne    schedule 23.05.2020