使用tf.keras拟合LSTM模型时报KeyError:168如何解决?
解决tf.keras 2.6.0下LSTM训练触发KeyError: 168的方案
报错根因
你遇到的KeyError: 168为TimeseriesGenerator索引越界导致,168正好是你设置的窗口长度参数值,Keras 2.6.0版本的TimeseriesGenerator在采样索引超出数据集边界时,会抛出该硬编码的字典Key错误。
分步修复方案
- 第一步:校验数据集拆分后长度合法性
TimeseriesGenerator要求输入的数据集样本数必须大于窗口长度,你设置win_length=168,因此拆分后的训练集、测试集行数都必须大于168。如果总数据量过小,8:2拆分后测试集行数≤168,会直接触发索引越界。
校验代码:print("训练集样本数:", len(X_train)) print("测试集样本数:", len(X_test)) print("窗口长度:", win_length) # 需保证前两个输出值均大于win_length - 第二步:修正TimeseriesGenerator初始化参数
不要额外配置stride、end_index等参数超出数据集范围,标准初始化逻辑参考:from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator # 训练集时序生成器 train_gen = TimeseriesGenerator( X_train, y_train, length=win_length, batch_size=batch_size, shuffle=False ) # 测试集时序生成器 test_gen = TimeseriesGenerator( X_test, y_test, length=win_length, batch_size=batch_size, shuffle=False ) - 第三步:预校验生成器可用性
初始化生成器后先尝试读取单个批次的样本,确认无报错后再启动训练:# 校验训练集生成器 batch_x, batch_y = train_gen[0] print("训练批次输入维度:", batch_x.shape) # 预期输出 (32, 168, 40) # 校验测试集生成器 test_batch_x, test_batch_y = test_gen[0] print("测试批次输入维度:", test_batch_x.shape) - 第四步:调整时序数据拆分规则
不要使用默认的train_test_split拆分时序数据,改为手动拆分并给测试集预留足够的历史窗口数据,避免测试集索引越界:split_ratio = 0.8 split_idx = int(len(all_data) * split_ratio) # 测试集开头预留win_length长度的历史数据,用于生成第一个测试样本 X_train, X_test = all_data[:split_idx], all_data[split_idx - win_length:] y_train, y_test = all_label[:split_idx], all_label[split_idx - win_length:]
补充排查点
如果执行完以上步骤仍报错,检查标签数据的维度是否和输入特征的第一维度完全匹配,Keras 2.6.0版本存在标签长度与生成器输出长度不匹配时,同样抛出KeyError的已知问题。
内容的提问来源于stack exchange,提问作者Patryk Kołakowski
相关产品推荐
相关产品推荐

