我在Tensorflow中应用DenseNet来执行简单的二进制分类任务并对最后几层进行微调。为了避免反向支持中的NaN问题,我已经将学习率降低到1e-7。
然而,我仍然在 Logit 摘要中获得了NaN。但由于它只是模型的前馈操作,因此logit如何才能成为NaN。
顺便说一下,因为DenseNet是从PyTorch预训练模型转换而来的,所以我使用了相同的预处理方法,得到了min -2.1,max 2.6,mean -0.3的输入。和标准1.3。此外,我将最后一个FC层更改为我自己的0.01正则化比例。
目前,我有两个假设。第一个是BN中的std得到零值。第二个是模型得到了一个奇怪的输入。
昨天,通过打印每层的日志'输出和变量,我发现原因是梯度爆炸导致一些变量更新为NaN。因为logit摘要中出现错误,所以误导我认为问题在前馈中。现在,通过使用渐变剪辑技巧,我解决了这个问题。