我在训练孪生网络的时候遇到了这个问题
现象0:
模型finetune,一开始的时候最后分类全连接层fc7输出特征值包含inf,可以用python np.any(np.isnan(fc7)) or not np.all(np.isfinite(fc7))
检测到。
可能的原因:初始化不好,你使用了不同结构的模型的权重做finetune,可以尝试:
1, 不finetune,从头训
2,finetune时不加载最后分类的全连接层权重,或者只加载部分层的权重
现象一:
模型loss稳定下降,训练集准确率特别高,loss特别低,几个epoch之后,突然出现模型输出特征值为nan,预测的人脸id为为0 (因为输出logit为0之后求argmax始终为0),loss为nan
分析:
- nan表示结果不是一个数。
- 大模型在小数据集上发生了过拟合
- 需要检查特征值输出,需要检查batch中输入的label和预测的label,需要检查loss公式(如果是自己构造的话)
解决:
- 减小模型或者增大数据集
- 将学习率降到很小,比如之前是0.1,现在改为0.0001,并且不再step下降
- 在一个训练得比较好的模型基础上finetune,学习率可能要设置小一点
- 样本没有做random flip
其他排查手段:
- 查看label是否正确,是否shuffle
- 如果训练loss很低,在训练集上测试模型,看是否真的都能预测正确
- 可视化输入样本,看是否正确
现象二:
出现inf
inf 表示结果太大,正无穷或者负无穷
可能的原因:
1,学习率太大,比如应该从0.1改为0.01或0.001。如果还不行,那应该是代码有问题
2, 你loss算的不对,导致太大
3, 你梯度算的不对,如果loss是手动构建的, 请手动推导梯度计算公式,并正确实现