模型训练出现 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

问题解决!!!!!!!