You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现字符与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:50:11