Keras训练LSTM时报InvalidArgumentError:索引-1不在[0,10)范围怎么办
报错原因与修正方案
核心报错触发逻辑
- Embedding层仅允许输入
[0, 词表大小)范围内的非负整数索引,当前Embedding层设置的词表大小为10,合法索引范围为0~9,输入数据中存在值为-1的非法索引,直接触发查找越界错误。 - 输入数据中的负索引一般来源于文本转序列的映射流程:未匹配到的词汇被默认赋值为-1,未纳入合法索引体系。
代码中存在的结构错误
- Embedding层参数与数据形状完全错位:现有代码
Embedding(10, 82, input_length=180568),将训练集总样本数180568设置为序列长度,将单样本序列长度82设置为嵌入向量维度,和实际数据形状((180568, 82) 即 180568个样本,单样本序列长度82)完全不匹配。 - LSTM层参数语法错误:
input_shape=features_train不符合Keras参数规则,input_shape需要接收元组格式的形状参数,不能直接传入整个训练集张量;且因前面已经衔接Embedding层,LSTM无需重复定义输入形状。 - 输出形状与标签不匹配:当前标签形状为(180568,),即每个样本对应一个二分类标签,但现有模型输出形状为(None, 180568, 10),即使解决Embedding层报错,也会触发后续的形状匹配错误。
具体修正步骤
- 清洗输入数据
- 执行代码检查特征数值范围:
print(f"特征最小值: {features.min()}, 特征最大值: {features.max()}") - 处理所有小于0的异常索引:可将-1映射为固定合法索引(如预留一个索引值作为未登录词标记),或直接删除包含非法索引的样本,确保所有特征值为0到(词表最大索引值)之间的非负整数。
- 执行代码检查特征数值范围:
- 调整模型结构
- 按照实际数据形状设置Embedding参数:input_length设为单样本序列长度82,input_dim设为特征最大索引值+1,嵌入维度取合理值即可。
- 调整LSTM层参数:将
return_sequences设为False,删除错误的input_shape参数。 - 增加匹配二分类任务的输出层,使模型输出形状与标签对齐。
修正后的可运行示例代码
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Activation, Dropout, Dense # 动态计算合法词表大小 vocab_size = features.max() + 1 # 单样本序列长度为82 seq_len = features_train.shape[1] model = Sequential() # 按照数据形状调整Embedding层参数 model.add(Embedding(input_dim=vocab_size, output_dim=32, input_length=seq_len)) # LSTM层自动适配Embedding输出形状,关闭返回序列参数 model.add(LSTM(16, return_sequences=False)) model.add(Dropout(0.2)) # 二分类输出层,匹配标签形状 model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.summary() # 训练流程 history = model.fit( features_train, labels_train, epochs=10, batch_size=128, validation_data=(features_test, labels_test) )
注意:如果处理完负索引后依然报错,需要确认Embedding层的
input_dim参数设置是否大于所有输入特征的最大值,否则依然会触发索引越界错误。
内容的提问来源于stack exchange,提问作者humblefool_9
相关产品推荐
相关产品推荐

