You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bidirectional LSTM时出现too many values to unpack报错求助

问题:Keras双向LSTM报错"too many values to unpack (expected 3)"

我正在搭建一个遵循通用流程的模型,但遇到了ValueError: too many values to unpack (expected 3)的报错。

相关代码

模型定义代码

encoder_inputs = Input(shape=(20,))
en_x=  Embedding(self.sequence_length, self.embedding_dim)(encoder_inputs)
encoder = Bidirectional(LSTM(200, return_state=True))
encoder_outputs, state_h, state_c = encoder(en_x)
encoder_states = [state_h, state_c]
decoder_inputs = Input(shape=(None,))
dex=  Embedding(self.sequence_length, self.embedding_dim)
final_dex= dex(decoder_inputs)

模型训练函数

model.fit(self.train_x, self.train_y,
                    epochs=self.epochs,
                    batch_size=self.batch_size,
                    sample_weight=self.train_mask,
                    shuffle=True, 
                    callbacks=[early_stopping, checkpoint],
                    validation_data=(self.val_x, self.val_y, self.val_mask))

报错信息

177                         en_x=  Embedding(self.sequence_length, self.embedding_dim)(encoder_inputs)
    178                         encoder = Bidirectional(LSTM(200, return_state=True))
--> 179                         encoder_outputs, state_h, state_c = encoder(en_x)
    180                         encoder_states = [state_h, state_c]
    181 

ValueError: too many values to unpack (expected 3)

解决方案

问题核心是Bidirectional包装的LSTM层返回值数量与你接收的变量数不匹配:

  • 普通LSTM层设置return_state=True时,返回(output, state_h, state_c)三个值
  • 但双向LSTM会同时返回前向、后向的状态,实际返回值是(output, forward_h, forward_c, backward_h, backward_c),共5个值

你需要修改接收返回值的代码,根据需求处理双向状态:

方案1:合并双向状态(常用做法)

将前向和后向的隐藏状态、细胞状态分别拼接,作为编码器的最终状态(需确保后续解码器LSTM的维度对应,比如设置为400=200*2):

from keras.layers import Concatenate

encoder = Bidirectional(LSTM(200, return_state=True))
encoder_outputs, forward_h, forward_c, backward_h, backward_c = encoder(en_x)
# 拼接前向与后向的状态
state_h = Concatenate()([forward_h, backward_h])
state_c = Concatenate()([forward_c, backward_c])
encoder_states = [state_h, state_c]

方案2:仅保留单方向状态(不推荐)

如果不需要双向信息,可以忽略其中一个方向的状态,但会浪费双向LSTM的优势:

encoder = Bidirectional(LSTM(200, return_state=True))
# 取后向状态,忽略前向的两个状态
encoder_outputs, _, _, state_h, state_c = encoder(en_x)
encoder_states = [state_h, state_c]

额外提醒:你的Embedding层参数顺序可能有误——Embedding的第一个参数应该是词汇表大小(vocab_size),而非序列长度self.sequence_length,正确写法应为Embedding(vocab_size, embedding_dim),这个问题虽不是当前报错原因,但可能导致后续训练异常,建议检查修正。

内容的提问来源于stack exchange,提问作者Mohamed Belhireche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:33:35