评估深度学习RNN模型时出现Anaconda函数调用栈InvalidArgumentError
报错定位与解决
核心错误本质
你遇到的InvalidArgumentError是Keras RNN模型推理阶段最常见的Embedding层查表越界问题,从报错信息可以直接定位到触发点:
关键报错片段:
indices[28,27] = 10792 is not in [0, 10000)
这句话的含义是:模型的Embedding层预设的词表大小为10000,仅支持取值范围在[0, 9999]的序列索引完成嵌入查表;但输入的测试集X_test_seq_padded中存在值为10792的索引,超出了Embedding层的支持范围,直接导致推理中断。
常见触发场景与对应修复方案
- 编码配置不统一
训练阶段通常会给Tokenizer设置num_words=10000的参数,仅保留最高频的10000个词生成索引,对不在词表内的词自动映射到统一的OOV值;但评估阶段重新处理测试数据时,没有复用训练时的Tokenizer配置,导致编码出的序列出现了超过10000范围的索引值。
修复方式:- 编码测试集时严格加载训练阶段保存的Tokenizer实例,保证
num_words参数与训练时完全一致 - 编码完成后做简单校验:
assert X_test_seq_padded.max() < 10000, "测试集存在超出词表范围的索引值"
- 编码测试集时严格加载训练阶段保存的Tokenizer实例,保证
- 未对测试集索引做范围截断
处理测试数据时,没有按照Embedding层的最大索引范围对超出值做裁剪,直接把包含大索引的序列送入模型。
可直接通过代码做批量截断修复,注意VOCAB_SIZE要和模型Embedding层的input_dim参数完全一致:import numpy as np VOCAB_SIZE = 10000 X_test_seq_padded = np.clip(X_test_seq_padded, 0, VOCAB_SIZE - 1) - 冗余的模型加载操作
你的代码中连续两行加载同一个模型文件:model = keras.models.load_model('你的模型路径.h5') model.load_weights('你的模型路径.h5')load_model方法会自动加载模型结构与全部权重,后续单独调用load_weights属于冗余IO操作,虽然不是本次报错的直接诱因,建议直接删除减少不必要的运行开销。
避坑提醒
不要为了适配测试集的大索引值,直接修改模型Embedding层的input_dim参数。因为Embedding层的权重是和原词表维度一一绑定的,修改维度会导致权重shape不匹配,触发新的报错。
内容的提问来源于stack exchange,提问作者Poopin Mah Business
相关产品推荐
相关产品推荐

