accuracy值不变,loss值为non或inf
训练和测试的Accuracy和Loss曲线,准确度曲线无变化,损失曲线没有,因为损失值是Non 或者Inf。学习率从0.1、0.01都是这样的。
后来将学习率减小到0.001,损失值有实值了,但是准确率仍然不变。
参考:
softmax在计算的过程中得到了概率值出现了零,由于softmax是用指数函数计算的,指数函数的值都是大于0的,所以应该是计算过程中出现了float溢出的异常,也就是出现了inf,nan等异常值导致softmax输出为0.
当softmax之前的feature值过大时,由于softmax先求指数,会超出float的数据范围,成为inf。inf与其他任何数值的和都是inf,softmax在做除法时任何正常范围的数值除以inf都会变成0.然后求loss就出现了87.3356的情况。
解决办法
由于softmax输入的feature由两部分计算得到:一部分是输入数据,另一部分是各层的权值等组成
减小初始化权重,以使得softmax的输入feature处于一个比较小的范围
降低学习率,这样可以减小权重的波动范围
如果有BN(batch normalization)层,finetune时最好不要冻结BN的参数,否则数据分布不一致时很容易使输出值变得很大(注意将batch_norm_param中的use_global_stats设置为false)。
观察数据中是否有异常样本或异常label导致数据读取异常
本文遇到的情况采用降低学习率的方法,learning rate设置为0.01或者原来loss的1/5或者1/10。
测试loss不降反升
加深网络层数,现在用的是5层全连接网络,relu激活函数,softmax分类器,
Adam优化器,损失函数是tf.nn.softmax_cross_entropy_with_logits(logits= , labels= )。
参考:www.zhihu.com/question/65439175
训练一个含3个隐含层的采用批规范化的2分类神经网络,随着参数的不断更新,测试集loss会上升,而测试集准确率却比开始时要高,请问这正常吗?
正常,很容易碰到。你用的是交叉熵,理论上,甚至可以通过给最后层权值乘以一个常数来改变 loss,同时却又不影响分类边界,也就是分类正确率保持不变。
不过你的 test loss 不断升高,不论正确率是否提高,这都是过拟合的一种表现,建议加上正则化手段。batch normalization 按原论文的说法,是减少 internal covariate shift 从而加速训练的手段,对过拟合有没有效果,至少我是不太信任的(,虽然原论文 3.4 节中有一段豆腐干大的文字表示自己连正则化都能包了,传说的一针见效啊 XD)。
减小网络层数
3层全连接,稍微 有些许变化,但还不够。
此时的网络参数:K(h1)=500, L(h2)=100, output=4
learining rate = 0.001 iter=800
All cost time: 167.1950433254242