TensorFlow时间序列预测教程改参数后报OverflowError如何解决
报错根因
你遇到的报错本质是Keras进度条渲染逻辑触发的异常:代码中self.target是evaluate阶段的总步数,当验证集/测试集对应的tf.data.Dataset为空时,self.target等于0,此时np.log10(0)会返回负无穷,转换为整数时就触发了OverflowError。
数据集为空的直接原因是:你当前的参数配置下,单样本需要的序列总长度(输入长度 + 预测步长,即input_width + OUT_STEPS)大于划分后的验证集/测试集的序列长度,滑动窗口逻辑无法生成任何有效样本,最终得到空数据集。
你用7万多条数据时没有报错,是因为划分后的验证集、测试集长度远大于窗口需要的总长度,可以正常生成样本。
排查步骤
- 先执行
print(len(val_df), len(test_df))打印验证集、测试集的原始样本数 - 再执行
print(wide_window.val.cardinality().numpy()),如果输出为0即可确认是验证集为空的问题
解决方法
- 调整数据集划分比例:降低验证集、测试集的占比,保证划分后每个子集的样本数都大于
input_width + OUT_STEPS,你的1440条总数据可以调整为9:0.5:0.5的训练/验证/测试划分比例 - 缩小窗口参数:如果不想调整划分规则,可以降低
input_width或者OUT_STEPS的数值,保证input_width + OUT_STEPS小于验证集、测试集的最小长度 - 临时规避进度条问题:在
evaluate方法中添加verbose=0参数,关闭进度条渲染即可绕过该报错,写法参考你测试集评估的代码行 - 补充输入数据:如果条件允许,增加输入时间序列的总长度,保证划分后的所有子集都满足窗口生成的长度要求
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

