训练LSTM多标签模型遇ValueError:缺少embedding_15_input数据
嘿,这个报错我太熟了——本质就是你的模型在喊“我要的输入数据没收到啊!”,具体来说它需要名为embedding_15_input的输入,但你训练时传的数据没对应上这个名字。咱们一步步来排查解决:
问题根源
Keras自动给你的第15个Embedding层生成了embedding_15_input这个输入名称,但你在训练时没有把数据和这个名称做绑定,导致模型找不到对应的数据。
解决步骤
1. 修正训练时的数据传入方式
直接在model.fit()里用字典映射输入名称和训练数据,确保模型能找到它要的输入:
# 假设你的训练特征数据是train_x,标签是train_y model.fit( x={'embedding_15_input': train_x}, y=train_y, batch_size=20, epochs=10, # 其他参数如validation_data等 )
如果你之前是直接传model.fit(train_x, train_y...),就会出现这个问题——因为当模型有明确命名的输入时,必须显式指定映射关系。
2. 可选:显式定义输入层,避免自动命名混乱
你现在用的是Sequential链式构建模型,Keras会自动给层生成名称,容易出现这种“数字后缀”的命名歧义。可以改用Functional API显式定义输入层,自己控制输入名称:
def lstm_twiter(n_input, n_out, input_dim, units_activation='tanh', batch_size=20 ): # 显式定义输入层,自定义名称 inputs = Input(shape=(n_input,), name='text_sequence_input') embedding_size_out = min(50, input_dim//2) # 连接Embedding层 x = Embedding( input_dim=input_dim, output_dim=embedding_size_out, activation=units_activation )(inputs) # 后续添加LSTM、全连接层等 x = LSTM(64)(x) # 多标签分类建议用sigmoid激活 outputs = Dense(n_out, activation='sigmoid')(x) model = Model(inputs=inputs, outputs=outputs) return model
这样训练时就可以用更清晰的名称传入数据:
model.fit(x={'text_sequence_input': train_x}, y=train_y, ...)
3. 验证数据形状是否匹配
最后别忘了检查你的训练数据train_x的形状:Embedding层要求输入是二维数组,格式为(样本数量, 序列长度),也就是每个样本是一个整数索引序列(对应词汇表中的词)。可以用print(train_x.shape)确认,确保和你传入的n_input参数一致——形状不匹配也可能间接引发这个输入找不到的报错。
内容的提问来源于stack exchange,提问作者Mo Abdolhosseini Moghaddam
相关产品推荐
相关产品推荐

