Keras seq2seq模型密集层需要3d输入

时间:2018-12-24 01:45:10

标签: python tensorflow keras embedding word-embedding

我最近已开始在Keras中制作序列到序列模型,主要是按照教程进行的,此处提供了链接: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

0 个答案:

没有答案
相关问题