张量流:层 "lstm_1" 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4



我有一个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具有形状(2000572265(,包含2000个句子,最多57个单词,以及一个热门编码标记。

decoder_input_data和decoder_target_data具有形状(200087987(,包含2000个句子,最多87个单词,以及一个热编码标记。Decoder_target_data从Decoder_input_data偏移一个时间步长。

据我所知,数据的格式是正确的,但当运行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)

我在这里做错了什么?

问题来自嵌入层。对我来说,你不能使用一个热编码与keras";编码";层事实上,正如文件中所说:

输入形状

形状为(batch_size,input_length(的2D张量。

输出形状

形状为(batch_size、input_length、output_dim(的三维张量。

请注意,它采用2D数组并输出3D数组。这就是为什么你的输入从3D阵列变成4D阵列(嵌入后(。这对你的LSTM不好,因为它只能接收3D阵列。

您应该将一个热编码转换为基本编号。因此,您只需要一个值:2,而不是[0,0,1,0]输入。

这样,您的输入将是一个2D数组:(batch_size,input_length(,并在嵌入层后转换为一个漂亮的3D数组:(batch_size,input_length,output_dim(。你的LSTM层会很高兴;(

相关内容

最新更新