Пример Keras на уровне слов с целочисленными последовательностями дает `ожидаемый ndim=3, найденный ndim=4`

Я пытаюсь реализовать пример уровня слова Keras в своем блоге, указанном в разделе " Бонус" -> Что, если я хочу использовать модель уровня слова с целочисленными последовательностями?

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

# Define an input sequence and process it - where the shape is (timesteps, n_features)
encoder_inputs = Input(shape=(None, src_vocab), name='enc_inputs')
# Add an embedding layer to process the integer encoded words to give some 'sense' before the LSTM layer
encoder_embedding = Embedding(src_vocab, latent_dim, name='enc_embedding')(encoder_inputs)
# The return_state constructor argument configures a RNN layer to return a list where the first entry is the outputs
# and the next entries are the internal RNN states. This is used to recover the states of the encoder.
encoder_outputs, state_h, state_c = LSTM(latent_dim, return_state=True, name='encoder_lstm')(encoder_embedding)
# 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 of the RNN.
decoder_inputs = Input(shape=(None, target_vocab), name='dec_inputs')
decoder_embedding = Embedding(target_vocab, latent_dim, name='dec_embedding')(decoder_inputs)
# The return_sequences constructor argument, configuring a RNN to return its full sequence of outputs (instead of
# just the last output, which the defaults behavior).
decoder_lstm = LSTM(latent_dim, return_sequences=True, name='dec_lstm')(decoder_embedding, initial_state=encoder_states)
decoder_outputs = Dense(target_vocab, activation='softmax', name='dec_outputs')(decoder_lstm)
# Put the model together
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

но я получаю

ValueError: Input 0 is incompatible with layer encoder_lstm: expected ndim=3, found ndim=4

на линии

encoder_outputs, state_h, state_c = LSTM(...

Что мне не хватает? Или пример в блоге предполагает шаг, который я пропустил?

Обновить:

И я тренируюсь с:

X = [source_data, target_data]
y = offset_data(target_data)
model.fit(X, y, ...)

Обновление 2:

Так что я все еще не совсем там. У меня есть мой decoder_lstm а также decoder_outputs определены, как указано выше, и зафиксировали входы. Когда я загружаю свою модель из h5 составить и построить свою модель вывода, я пытаюсь подключиться к обучению model с

decoder_inputs = model.input[1]  # dec_inputs (Input(shape=(None,)))
# decoder_embedding = model.layers[3]  # dec_embedding (Embedding(target_vocab, latent_dim)) 
target_vocab = model.output_shape[2]
decoder_state_input_h = Input(shape=(latent_dim,), name='input_3')  # named to avoid conflict
decoder_state_input_c = Input(shape=(latent_dim,), name='input_4')
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
# Use decoder_lstm from the training model
# decoder_lstm = LSTM(latent_dim, return_sequences=True)
decoder_lstm = model.layers[5] # dec_lstm
decoder_outputs, state_h, state_c = decoder_lstm(decoder_inputs, initial_state=decoder_states_inputs)

но я получаю ошибку

ValueError: Input 0 is incompatible with layer dec_lstm: expected ndim=3, found ndim=2

Пытаясь пройти decoder_embedding скорее, чем decoder_inputs тоже не удается

Я пытаюсь адаптировать пример lstm_seq2seq_restore.py, но он не включает в себя сложность уровня внедрения.

Обновление 3:

Когда я использую decoder_outputs, state_h, state_c = decoder_lstm(decoder_embedding, ...) чтобы построить модель вывода, я подтвердил, что decoder_embedding является объектом типа Embedding но я получаю:

ValueError: Layer dec_lstm was called with an input that isn't a symbolic tensor. Received type: <class 'keras.layers.embeddings.Embedding'>. Full input: [<keras.layers.embeddings.Embedding object at 0x1a1f22eac8>, <tf.Tensor 'input_3:0' shape=(?, 256) dtype=float32>, <tf.Tensor 'input_4:0' shape=(?, 256) dtype=float32>]. All inputs to the layer should be tensors.

Полный код для этой модели находится на Bitbucket.

1 ответ

Решение

Проблема в форме ввода Input слой. Встраиваемый слой принимает в качестве входных данных последовательность целых чисел, которая соответствует индексам слов в предложении. Так как здесь количество слов в предложениях не фиксировано, поэтому вы должны установить форму ввода Input слой как (None,),

Я думаю, что вы ошибаетесь в том, что в нашей модели нет слоя Embedding, и поэтому форма входа модели (timesteps, n_features) сделать его совместимым со слоем LSTM.

Обновить:

Вам нужно пройти decoder_inputs в слой Embedded, а затем передать полученный тензор вывода в decoder_lstm слой как это:

decoder_inputs = model.input[1] # (Input(shape=(None,)))
# pass the inputs to the embedding layer
decoder_embedding = model.get_layer(name='dec_embedding')(decoder_inputs) 

# ...

decoder_lstm = model.get_layer(name='dec_lstm') # dec_lstm
decoder_outputs, state_h, state_c = decoder_lstm(decoder_embedding, ...)

Обновление 2:

Во время обучения, при создании decoder_lstm слой, который нужно установить return_state=True:

decoder_lstm, _, _ = LSTM(latent_dim, return_sequences=True, return_state=True, name='dec_lstm')(decoder_embedding, initial_state=encoder_states)
Другие вопросы по тегам