Получена ошибка при построении авто кодировщика - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь создать авто-кодировщик для моего проекта, используя CNN в качестве Encoder и LSTM в качестве Decoder, хотя когда я отображаю сводку модели. Я получаю следующую ошибку:

ValueError: вход 0 несовместим со слоем lstm_10: ожидаемый ndim = 3, найденный ndim = 2

x.shape = (45406, 100, 100)
y.shape = (45406,)

Я уже пытался изменить форму ввода для LSTM, но это не сработало.

def keras_model(image_x, image_y):

model = Sequential()
model.add(Lambda(lambda x: x / 127.5 - 1., input_shape=(image_x, image_y, 1)))

last = model.output
x = Conv2D(3, (3, 3), padding='same')(last)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = MaxPooling2D((2, 2), padding='valid')(x)

encoded= Flatten()(x)
x = LSTM(8, return_sequences=True, input_shape=(100,100))(encoded)
decoded = LSTM(64, return_sequences = True)(x)

x = Dropout(0.5)(decoded)
x = Dense(400, activation='relu')(x)
x = Dense(25, activation='relu')(x)
final = Dense(1, activation='relu')(x)

autoencoder = Model(model.input, final)

autoencoder.compile(optimizer="Adam", loss="mse")
autoencoder.summary()

model= keras_model(100, 100)

1 Ответ

0 голосов
/ 27 марта 2019

Учитывая, что вы используете LSTM, вам нужно измерение времени. Таким образом, ваша форма ввода должна быть: (time, image_x, image_y, nb_image_channels).

Я бы предложил получить более глубокое понимание автоэнкодеров, LSTM и 2D Convolution, так как все они здесь играют. Это полезное вступление: https://machinelearningmastery.com/lstm-autoencoders/ и это https://blog.keras.io/building-autoencoders-in-keras.html).

Также посмотрите на этот пример, кто-то реализовал LSTM с Conv2D Как изменить 3-канальный набор данных для ввода в нейронную сеть . Здесь полезен слой TimeDistributed.

Однако, чтобы исправить ошибку, вы можете добавить слой Reshape (), чтобы имитировать дополнительное измерение:

def keras_model(image_x, image_y):

    model = Sequential()
    model.add(Lambda(lambda x: x / 127.5 - 1., input_shape=(image_x, image_y, 1)))

    last = model.output
    x = Conv2D(3, (3, 3), padding='same')(last)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((2, 2), padding='valid')(x)

    encoded= Flatten()(x)
    # (50,50,3) is the output shape of the max pooling layer (see model summary)
    encoded = Reshape((50*50*3, 1))(encoded)
    x = LSTM(8, return_sequences=True)(encoded)  # input shape can be removed
    decoded = LSTM(64, return_sequences = True)(x)

    x = Dropout(0.5)(decoded)
    x = Dense(400, activation='relu')(x)
    x = Dense(25, activation='relu')(x)
    final = Dense(1, activation='relu')(x)

    autoencoder = Model(model.input, final)

    autoencoder.compile(optimizer="Adam", loss="mse")
    print(autoencoder.summary())

model= keras_model(100, 100)
...