Jupyter Notebook中RuntimeWarning数值溢出等错误的解决方法
修复Jupyter Notebook中的RuntimeWarning(溢出与无效值)
首先,先把你的代码和报错信息整理清楚:
你的训练代码:
for i in range(0,train_len): avg = (x1[i] + x2[i] + x3[i] + x4[i])/4 h = x0*w0 + x1[i]*w1 + x2[i]*w2 + x3[i]*w3 + x4[i]*w4 error = avg - h w0 = w0 + n*error w1 = w1 + n*x1[i]*error w2 = w2 + n*x2[i]*error w3 = w3 + n*x3[i]*error w4 = w4 + n*x4[i]*error
报错信息:
C:\Users\Md. Arif Ahmed\Anaconda3\lib\site-packages\ipykernel_launcher.py:3: RuntimeWarning: overflow encountered in double_scalars This is separate from the ipykernel package so we can avoid doing imports until C:\Users\Md. Arif Ahmed\Anaconda3\lib\site-packages\ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in double_scalars """ C:\Users\Md. Arif Ahmed\Anaconda3\lib\site-packages\ipykernel_launcher.py:6: RuntimeWarning: invalid value encountered in double_scalars C:\Users\Md. Arif Ahmed\Anaconda3\lib\site-packages\ipykernel_launcher.py:7: RuntimeWarning: invalid value encountered in double_scalars import sys C:\Users\Md. Arif Ahmed\Anaconda3\lib\site-packages\ipykernel_launcher.py:8: RuntimeWarning: invalid value encountered in double_scalars C:\Users\Md. Arif Ahmed\Anaconda3\lib\site-packages\ipykernel_launcher.py:9: RuntimeWarning: invalid value encountered in double_scalars if __name__ == '__main__':
问题原因分析
这些警告的核心是数值溢出:
- 第一个
overflow encountered说明计算中某个值超出了Python双精度浮点数的范围,变成了inf(无穷大)或者-inf。 - 后续的
invalid value则是因为inf/nan参与了后续的权重计算,导致结果变成无效值。
通常触发这种问题的常见场景有三个:
- 学习率
n设置得太大,每次权重更新的幅度过猛,直接把数值推到溢出。 - 输入特征
x0、x1、x2、x3、x4没有做归一化/标准化,不同特征量级差异大或者本身数值过大,放大了权重更新的影响。 - 初始权重
w0-w4设置得不合理(比如初始值太大),后续计算很快失控。
具体修复方案
按优先级尝试以下方法:
1. 调小学习率
这是最常见的解决办法。如果你的学习率n是0.1以上的数值,先试着改成0.01、0.001甚至更小,逐步找到一个能让数值稳定的范围。比如:
n = 0.001 # 替换你原来的学习率值
2. 对输入特征做归一化/标准化
把所有输入特征的数值缩放到一个小范围,能从根源上避免因数据量级导致的权重爆炸。常用的两种方法:
- Min-Max归一化(缩放到0-1):
import numpy as np # 对每个特征单独处理 x0 = (x0 - x0.min()) / (x0.max() - x0.min()) x1 = (x1 - x1.min()) / (x1.max() - x1.min()) x2 = (x2 - x2.min()) / (x2.max() - x2.min()) x3 = (x3 - x3.min()) / (x3.max() - x3.min()) x4 = (x4 - x4.min()) / (x4.max() - x4.min()) - Z-score标准化(均值为0,方差为1):
x0 = (x0 - x0.mean()) / x0.std() x1 = (x1 - x1.mean()) / x1.std() # 其他特征同理
3. 合理初始化权重
不要给初始权重设置过大的值,用小随机数初始化是常规操作:
import numpy as np w0 = np.random.randn() * 0.01 w1 = np.random.randn() * 0.01 w2 = np.random.randn() * 0.01 w3 = np.random.randn() * 0.01 w4 = np.random.randn() * 0.01
4. 添加权重正则化(可选)
如果前面的方法还不够,给权重更新加上正则项,限制权重的增长:
lambda_reg = 0.0001 # 正则系数,从小值开始试 w0 = w0 + n*error - n*lambda_reg*w0 w1 = w1 + n*x1[i]*error - n*lambda_reg*w1 w2 = w2 + n*x2[i]*error - n*lambda_reg*w2 w3 = w3 + n*x3[i]*error - n*lambda_reg*w3 w4 = w4 + n*x4[i]*error - n*lambda_reg*w4
5. 检查输入数据是否异常
确认你的输入数据里有没有本身就存在的nan或者inf,这些会直接导致计算出错:
print("x1是否有异常值:", np.any(np.isnan(x1)) or np.any(np.isinf(x1))) # 对其他x2、x3、x4、x0做同样检查
如果有异常值,先清理数据(比如用均值填充异常样本,或者直接删除)。
验证修改
调整完之后重新运行代码,观察警告是否消失。如果还有问题,可以再进一步调小学习率,或者增加正则系数,直到数值稳定下来。
内容的提问来源于stack exchange,提问作者Arif Ahmed
相关产品推荐
相关产品推荐

