keras tensorflow:层“lstm_1”的输入0与层不兼容:预期ndim=3,找到ndim=4

tjvv9vkg  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(144)

我构建了一个seq2seq模型,如下所示:

latent_dim = 256
epochs = 20
batch_size = 64
encoder_inputs = Input(shape=(None,))
x = Embedding(num_encoder_tokens, latent_dim,input_length=max_english_sentence_length)(encoder_inputs)
x, state_h, state_c = LSTM(latent_dim,return_state=True)(x)
encoder_states = [state_h, state_c]

decoder_inputs = Input(shape=(None,))
x = Embedding(num_decoder_tokens, latent_dim,input_length=max_toki_sentence_length)(decoder_inputs)
x = LSTM(latent_dim, return_sequences=True)(x, initial_state=encoder_states)
decoder_outputs = Dense(num_decoder_tokens, activation='softmax')(x)

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=["accuracy"])
model.summary()

model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
      batch_size=batch_size,
      epochs=epochs,
      validation_split=0.2)

encoder_input_data具有形状(2000,57,7265),并且包含具有最多57个单词的2000个句子,具有一位热码编码的标记。
decoder_input_data和decoder_target_data的形状为(2000,87,987),包含最多87个单词的2000个句子,具有一位热码编码标记。
据我所知,数据的格式是正确的,但当运行model.fit时,我得到:

Input 0 of layer "lstm" is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (64, 57, 7265, 256)

我做错了什么?

scyqe7ek

scyqe7ek1#

这个问题来自于嵌入层。对我来说,你不能使用一个热编码与keras“嵌入”层。事实上,正如在文档中所说:

输入图形

具有形状的2DTensor:(批次大小,输入长度)。

输出图形

带形状的3DTensor:(批次大小、输入长度、输出尺寸)。
注意,它接受一个2D数组,输出一个3D数组。这就是为什么你的输入从3D数组变成了4D数组(在嵌入之后)。这对你的LSTM是不利的,因为它只能接收3D数组。
你应该把你的一个热编码转换成一个基本的编号,所以你只需要一个值,而不是一个[0,0,1,0,0]输入:2.
这样,您的输入将是一个2D数组:(batch_size,input_length),并将在嵌入层之后转换为一个漂亮的3D数组:(batch_size,input_length,output_dim)。并且您的LSTM层会很高兴;)

相关问题