模型训练出现 loss = nan
问题:模型不管怎么调参数,损失均为 nan
换了模型层,换了损失函数,还检查了 loss 的计算方式。还在其他地方验证了 loss 计算正确。
问题定位:
我是在对数据集做了新的不同预处理才出现问题的,训练以前的预处理数据集不会出现此情况。
1.排除预处理 -------将保留两位小数注释掉,仍然出现 loss = nan,说明小数点不是引起的问题的关键原因
2.排除预处理 -------滤波函数注释掉,不会出现 loss = nan,说明问题出现在滤波函数。
3.排除特别信号--------引入单个信号不会出现 loss 问题,引入整个数据集出现 loss = nan,说明可能是某段信号出现问题或者模型拟合不了整个数据集。
重新预处理数据集进行滤波,发现数据集中某个信号会出现代码警告,当时以为问题不大现在看就是这里的问题:
04015采集完成 44001 44001
C:\Users\xxx\.conda\envs\py110_py38\lib\site-packages\pywt\_thresholding.py:23: RuntimeWarning: invalid value encountered in true_divide
thresholded = (1 - value/magnitude)
04043采集完成 105912 105912
现在将出现问题的信号04043 隔离训练。
发现只要将 04043号信号送入模型就会出现 loss = nan,其他信号均不会出现 loss = nan
解决问题
进入报错位置,思考是 小波变换库 pywt 阈值函数出现了问题,下面第三行代码处,出现了 除 0错误。
# 进入文件
.conda\envs\py110_py38\lib\site-packages\pywt\_thresholding.py:23
# 查看代码
with np.errstate(divide='ignore'):
# divide by zero okay as np.inf values get clipped, so ignore warning.
thresholded = (1 - value/magnitude)
thresholded.clip(min=0, max=None, out=thresholded)
thresholded = data * thresholded
# 直接修改库代码
thresholded = (1 - value/magnitude) 修改为 thresholded = (1 - value/(magnitude + 1e-09))
重新生成滤波数据集,问题解决。
04015采集完成 44001 44001
04043采集完成 105912 105912
数据集生成过程,不再报错,现在送入模型 loss 重新出现。科研的光芒!!!!!!!!
Epoch:1 , ACC on test:0.3064353168, loss:0.0006997338 time:111.33 s
Epoch:2 , ACC on test:0.4708186388, loss:0.0006386279 time:76.33 s
Epoch:1 , ACC on test:0.6548216343, loss:0.0006988451 time:92.72 s
Epoch:2 , ACC on test:0.4710667729, loss:0.0006125508 time:83.54 s
Epoch:3 , ACC on test:0.9052868485, loss:0.0004726056 time:84.26 s
问题解决!!!!!!!