Плотный слой модели Keras seq2seq, требующий трехмерных входов - PullRequest
0 голосов
/ 24 декабря 2018

Я недавно начал создавать последовательность к модели последовательности в Керасе, в основном после учебного пособия, ссылка на который приведена здесь: https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html

Несмотря на то, что он работал нормально, используя их метод, мне нужнодобавить слой встраивания в мою модель из-за ограничений памяти на моем устройстве.Когда я попытался добавить слои для встраивания, сеть дала следующий ответ.Я также дал важные фрагменты моего кода ниже.Я надеюсь, что это простая проблема, на которую я смотрю неправильно.Заранее большое спасибо!

Код:

encoder_input_data = np.zeros((len(inputs), max_len))
decoder_input_data = np.zeros((len(outputs), max_len))
decoder_target_data = np.zeros((len(outputs), max_len))

# Define an input sequence and process it.
encoder_inputs = Input(shape=(None,))
embedding = Embedding(num_encoder_tokens, latent_dim)
embeddingOutputs = embedding(encoder_inputs)
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(embeddingOutputs)
# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(None,))
# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the
# return states in the training model, but we will use them in inference.
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(embedding(decoder_inputs),
                                     initial_state=encoder_states)
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)

# Define the model that will turn
# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

for i in range(epochs):
    # Run training

    model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
              batch_size=batch_size,
              epochs=1)
    # Save model
    model.save_weights('s2s.h5')

Сообщение об ошибке:

Traceback (most recent call last):
  File "newTrain.py", line 182, in <module>
    encoder_outputs, state_h, state_c = encoder(embeddingOutputs)
  File "/usr/local/lib/python3.6/dist-packages/keras/layers/recurrent.py", line 532, in __call__
    return super(RNN, self).__call__(inputs, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py", line 414, in __call__
    self.assert_input_compatibility(inputs)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py", line 311, in assert_input_compatibility
    str(K.ndim(x)))
ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4
...