2019-3-20 20:17
问题:在训练YOLO-V2的目标检测模型时,使用resnet18的主网络架构,并利用其预训练权重,在训练的一段时间后,网络出现NAN值?
解决:经各方面验证发现,网络经过几次迭代之后,发生梯度爆炸,导致梯度更新之后,出现NAN值。网上查询了几种梯度爆炸的解决方式,例如什么减小学习率,残差网络,relu激活,bn层等。显然,这些方式,本模型中已经具备。还有一种方式就是利用tf.clip_by_value函数进行截断。截断分两种,一种是模型计算种出现除0的这种情况,对0值进行截断,另一种就是直接对梯度进行截断。我采用的是对梯度进行截断,因为本模型种没有除0的情况。实验表明,这种方式确实能够解决梯度爆炸的问题,但是对模型收敛的速度似乎有点影响。
后来,收到其他博客的启发,想到冻结训练的方式。我冻结了预训练部分的权重,只训练初始化部分的权重,效果很明显,模型收敛很快,也没有出现NAN值。待模型的loss下降稳定之后,我再开启全局训练,不知道后期的情况如何......待更。。。
2019-3-20 22:35
接着上一个问题,当loss值稳定之后,我进行全局训练并没有出现NAN值,哈哈哈哈,问题解决!!!!!
2019-4-11 01:44