Keras/TensorFlow训练时inf及超大值处理异常问题求助
解决Keras/TensorFlow训练中数据超大值导致的归一化错误
问题根源
你之前的代码只替换了np.inf(无限大)和-np.inf(无限小),但数据中存在的是超过np.float64最大有限值的数值——这类值是有限数,只是超出了float64能表示的上限,不属于inf范畴,所以不会被replace([np.inf, -np.inf], np.nan)处理。
当你尝试转float32时,这些超大值会因为溢出被转换为inf,触发ValueError;归一化时(比如计算均值、极值),超大值会导致计算结果异常,甚至直接溢出成inf,引发训练异常。
处理方案
1. 直接识别并移除超大值
先定位所有超出float64取值范围的数值,替换为nan后再清理:
import numpy as np float64_max = np.finfo(np.float64).max float64_min = np.finfo(np.float64).min # 替换超出范围的值为nan Data[Data > float64_max] = np.nan Data[Data < float64_min] = np.nan # 再执行原本的inf替换和空值清理 Data.replace([np.inf, -np.inf], np.nan, inplace=True) Data.dropna(inplace=True)
2. 分位数截断(更稳健)
如果超大值是极端异常值,建议用分位数截断,保留大部分合理数据:
# 对每个特征,截断到0.1%和99.9%分位数区间 for col in Data.columns: q_low = Data[col].quantile(0.001) q_high = Data[col].quantile(0.999) # 保留区间内的数据 Data = Data[(Data[col] >= q_low) & (Data[col] <= q_high)]
3. 预处理后验证
处理完成后,可通过以下代码确认数据无异常:
# 检查是否还有inf或超出范围的值 print(np.any(np.isinf(Data))) print(np.any(Data > float64_max)) print(np.any(Data < float64_min))
确认无异常后,再执行转float32和归一化操作即可。
内容的提问来源于stack exchange,提问作者Aurepilous
相关产品推荐
相关产品推荐

