在改完损失函数后,我的模型又nan了。
有了之前的经验,我决定观察一下数据。之前已经说过,使用交叉熵就不会nan,使用相关系数就会nan。
这是使用交叉熵的结果


对比一下,发现两者好像也没什么差异。。。这次发现是在第89步以后nan了。仔细观察代码发现
目前的几个值都很正常。这个问题今天必须搞清楚为什么。

但是梯度回传一下就炸了。。。
调试代码
print(x.max(),x.max())
print(y.max(),y.min())
print(model.linear1.weight.max(),model.linear1.weight.min())
print(model.linear2.weight.max(),model.linear2.weight.min())
师弟告诉我说,
print(model.linear2.weight.grad.max(),model.linear2.weight.grad.min())
print(model.linear1.weight.grad.max(),model.linear1.weight.grad.min())
好吧,在很多很多的讨论之后,在大家共同帮助下,我重新算了求导过程,发现相关系数求导的时候sum(vx^2)不能为0,否则会炸。其实一般也不会为0,但是我的eeg里面有一段数据当时没有截取正确,后期进行了补零处理。。。
一直没想到这一点。

将原始数据修改后,总算不nan了。
这告诉我们一个道理,即使原始数据没有nan,梯度重传也会出问题!用相关系数当损失函数的时候不能有全零数据!