Пример 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)