Keras中将seq2seq模型LSTM替换为GRU时initial_state不兼容报错
报错根因
你是直接沿用了LSTM版本seq2seq的状态处理逻辑,而GRU和LSTM的状态结构存在本质差异:
- LSTM有两个独立状态:隐藏态
h、细胞态c,设置return_state=True时会返回3个值:(序列输出, h, c) - GRU只有1个隐藏状态,设置
return_state=True时仅返回2个值:(序列输出, 隐藏态h)
你传了2个状态给仅需要1个状态的GRU解码器,就触发了状态维度不匹配的报错。
修复代码
按以下两处修改即可正常运行:
- 修改编码器状态接收逻辑
- 修改解码器状态接收与初始化逻辑
修正后完整代码如下:
time_steps_encoder=80 num_encoder_tokens=4096 latent_dim=512 time_steps_decoder=10 num_decoder_tokens=1500 batch_size=320 # 编码器设置 encoder_inputs = Input(shape=(time_steps_encoder, num_encoder_tokens), name="encoder_inputs") # 注意原代码里编码器name拼写错误endcoder→encoder,不影响运行可按需修改 encoder = GRU(latent_dim, return_state=True,return_sequences=True, name='encoder') # GRU只返回两个值:序列输出、最终隐藏态,不需要state_c encoder_outputs, state_h = encoder(encoder_inputs) # 编码器仅需传递一个状态给解码器 encoder_states = [state_h] # 解码器设置 decoder_inputs = Input(shape=(time_steps_decoder, num_decoder_tokens), name= "decoder_inputs") decoder = GRU(latent_dim, return_sequences=True, return_state=True, name='decoder') # 解码器GRU仅返回两个值,initial_state传入单状态即可 decoder_outputs, _ = decoder(decoder_inputs, initial_state=encoder_states) decoder_dense = Dense(num_decoder_tokens, activation='softmax', name='decoder_relu') decoder_outputs = decoder_dense(decoder_outputs) model = Model([encoder_inputs, decoder_inputs], decoder_outputs) model.summary() plot_model(model, to_file='model_train.png', show_shapes=True, show_layer_names=True)
内容的提问来源于stack exchange,提问作者Rushad
相关产品推荐
相关产品推荐

