使用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
相关产品推荐
相关产品推荐

