实现字符与Word LSTM时触发InvalidArgumentError的技术求助
解决字符+词级LSTM的索引越界错误
这个InvalidArgumentError我太熟悉了——本质就是你的字符嵌入层能处理的索引范围,没覆盖到输入数据里实际出现的字符索引值。咱们拆解一下问题,再给出具体的修复方案:
问题根源
错误提示里明确说了:indices[310,0] = 119 is not in [0, 119)。翻译过来就是:你的字符嵌入层只接受0~118的索引,但输入数据的第310个样本里,出现了119这个索引值,超出了范围。
看你定义字符嵌入层的代码:
emb_char = Embedding(input_dim=n_chars + 1, output_dim=20, input_length=max_len_char, mask_zero=True)
这里的input_dim设置成了n_chars +1,但显然你的字符数据里最大索引是119,而当前input_dim=119的话,嵌入层能处理的最大索引是input_dim-1=118,自然就会报错。
修复步骤
1. 修正字符嵌入层的input_dim
把input_dim改成字符数据中的最大索引值 +1,这样才能覆盖所有可能的字符索引。你可以先计算字符输入的最大值:
import numpy as np max_char_idx = np.max(X_char_tr) # 重新定义字符嵌入层 emb_char = Embedding(input_dim=max_char_idx + 1, output_dim=20, input_length=max_len_char, mask_zero=True)
这样嵌入层就能处理从0到max_char_idx的所有索引了。
2. 检查字符预处理的一致性
还要确认你在预处理字符数据时,有没有遗漏的情况:
- 如果用了
Tokenizer处理字符,要确保fit_on_texts遍历了所有训练数据里的字符,没有漏掉任何字符导致编码超出范围; - 如果有测试数据,也要保证测试数据里的字符都在训练时构建的字符词汇表内,要是有未见过的字符,要么替换成OOV(未登录词)标记,要么重新构建包含所有字符的词汇表。
3. 简化训练输入的处理
你的X_char_tr形状已经是(2770, 10, 30),和模型要求的(max_len, max_len_char)完全匹配,训练时不需要额外reshape,直接用X_char_tr.astype('float32')就行,避免不必要的形状错误:
history = model.fit( [X_word_tr, X_char_tr.astype('float32')], np.array(to_categorical(y_tr)), epochs=10, verbose=1 )
4. 顺带验证词嵌入层的正确性
虽然这次报错不在词嵌入层,但也可以顺手检查下:你的词嵌入层设置了vocab_size +1,要确认X_word_tr里的最大索引值小于vocab_size +1,避免后续出现类似的索引越界问题。
内容的提问来源于stack exchange,提问作者mojbius
相关产品推荐
相关产品推荐

