Tensorflow中YOLO类网络用ReLU输出激活出现NaN损失值的原因
类YOLO架构输出层激活函数切换后损失NaN的原因分析
损失函数与激活函数的冲突
你的任务中width和height是固定的3或5,若仍将其作为回归任务配合ReLU激活,初始训练阶段模型可能输出接近0的极小值。如果损失函数包含对数运算、除法等依赖非零/合理输入的操作(比如自定义损失里的归一化计算),会直接触发NaN。另外x、y需要限制在0-1区间,ReLU仅能保证非负,无法约束上限,若模型预测出远大于1的x/y值,会导致MSE这类损失值瞬间爆炸,进而引发梯度溢出,参数更新后出现NaN。学习率设置过高
ReLU本身容易出现梯度爆炸或“神经元死亡”的情况,若学习率偏大,参数更新幅度过大,会让模型输出值迅速超出浮点计算的有效范围,直接导致损失计算时出现NaN。模型初始化不当
如果模型权重初始化数值过大,经过ReLU激活后会产生极大的输出值,后续损失计算时很容易出现数值溢出,变成NaN。任务建模不合理
width和height是固定的离散值(3或5),更适合作为分类任务处理而非回归。之前用线性激活做回归本身就不符合任务特性,换成ReLU后,这种不合理的建模会放大优化过程中的数值问题,最终导致损失NaN。正确的做法应该是:x、y用sigmoid激活限制在0-1区间,width和height做成二分类任务(对应3和5)用softmax激活,再配合回归损失+分类损失的组合损失函数。
内容的提问来源于stack exchange,提问作者darmstadt beste
相关产品推荐
相关产品推荐

