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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:48:00