开始之前的小感慨 :(在训练神经网络模型时,发现导入了负样本之后没办法计算loss,在这个问题上花了整整两天时间,晚上淋了一场雨,满满的伤心,回来咬咬牙继续硬刚,终于发现问题出现再哪了,检查问题的过程非常耗时耗精神。


先上图,出现的问题如下:

神经网络在反向传播前计算loss值要反归一化吗 神经网络loss为负_神经网络模型


就如图中显示的loss:nan,看到这个nan就觉得恶心,刚了两天,其实就是一个小问题,主要是一开始没有方向性,在代码里各种检测,花费了大量时间,希望给其他可能会遇到类似问题的人提供一些思路,特别希望大家不会遇到这种坑 TAT

首先说一下,怎么分析出来是负样本问题的,一开始我并不知道是负样本出了问题,后来一步步检查才发现的,如果想直接知道怎么解决,翻到最下面即可。

思路:

  1. 首先,数据是成功导入的,可以训练的,这就说明导入数据格式没有问题,确定这一点也花了不少功夫,一直在检查是不是导入的数据集里有很多空集或0,因为数据集比较大,加上负样本,有三百万组数据,所以一开始以为是空集和0特征向量造成的,后来检查发现,并不是,数据集都是没有问题的。
  2. 数据处理部分的逻辑关系,这个反反复复修改了很多个版本,当然也发现了之前代码的一些错误,但并不是关键原因,这个就比较扎心了,每次发现问题之后的期待,重新跑模型依然发现还是loss没办法计算。在这一部分关注的焦点是label,其实已经很接近真相了,只是我的关注重点是产生的label是不是有空集的情况,最后发现,也不是逻辑关系,产生的label ”没问题“。但到这一步就更扎心了,label是最容易出问题的一个地方,居然不是label的问题,那路在何方? ?
  3. 最后,终于发现问题了,因为之前没有加入负样本来跑是可以的,不断思考中发现,没有包含负样本的神经网络模型输出是5635个单元的softmax分类问题,实际label的数量是5634,我现在加入了负样本的神经网络模型,把负样本全部标记为label=5635,因为是在Keras里使用loss='sparse_categorical_crossentropy'计算损失函数,没有注意到label溢出的问题,如果是使用loss='categorical_crossentropy',需要自己加上代码转换为one-hot vector这时应该就会发现问题的,所以,最终只要将负样本的label改成等于0或将输出层的单元数改成5636就可以了,如下:
output = Dense(5636,activation='softmax')(Drop_1) #output

好了,吐槽了一堆,希望大家不要犯这种小错误,检查过程真心痛苦,各种怀疑人生,也希望这些经验能给大家一些参考。