API-интерфейс Keras дает ошибку «ожидаемый ndim = 3, найденный ndim = 4» - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь построить модель с несколькими входами и несколькими выходами, используя keras function api , и я слежу за их кодом, но я получил эту ошибку:

ValueError: Input0 несовместим со слоем lstm_54: ожидаемый ndim = 3, найденный ndim = 4

Я получил эту ошибку при создании слоя lstm_out, вот код:

def build_model(self):
    main_input = Input(shape=(self.seq_len, 1), name='main_input')
    #seq_len = 50, vocab_len = 1000
    x = Embedding(output_dim=512, input_dim=self.vocab_len()+1, input_length=self.seq_len)(main_input)

    # A LSTM will transform the vector sequence into a single vector,
    # containing information about the entire sequence
    lstm_out = LSTM(50)(x)
    self.auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

    auxiliary_input = Input(shape=(self.seq_len,1), name='aux_input')
    x = concatenate([lstm_out, auxiliary_input])

    # We stack a deep densely-connected network on top
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)

    # And finally we add the main logistic regression layer
    main_output = Dense(1, activation='sigmoid', name='main_output')(x)

    self.model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

    print(self.model.summary())
    self.model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

IЯ думал, что проблема с input_dim в слое Embedding, но я прочитал в документации keras , что (input_dim должен равняться размеру словаря + 1).

Я не знаю точно, почему яполучил, и какова точная ошибка в моей input_dim, и как ее решить?

1 Ответ

0 голосов
/ 25 ноября 2018

Входная форма для встраивания должна быть двухмерным тензором с формой: (batch_size, sequence_length).В вашем коде представлен фрагмент main_input, который является 3D-тензором.Чтобы исправить это, измените следующие строки:

main_input = Input(shape=(self.seq_len, 1), name='main_input')
<...>
auxiliary_input = Input(shape=(self.seq_len,1), name='aux_input')

на:

main_input = Input(shape=(self.seq_len, ), name='main_input')
<...>
auxiliary_input = Input(shape=(self.seq_len, ), name='aux_input')

Это должно решить проблему с различными размерами

...