keras学习-增加acc曲线和loss曲线绘制

背景

前面的文章主要是针对keras实际实际预测的数据,绘制了数据的折线图。实际上我们也要对我们的模型实效果做一些评估。目前比较主要的两个数据 loss 和acc。

绘制

原理

Keras模型训练中的history对象通过调用fit()函数来训练LSTM模型。此函数返回一个名为history的对象,该对象包含损失的跟踪以及在编译模型期间指定的所有参数,在周期结束时记录数据。

代码

history = model.fit(xx)

acc = history.history['acc']
loss = history.history['loss']
epochs = range(1, len(acc) + 1)
 
plt.title('Accuracy and Loss')
plt.plot(epochs, acc, 'red', label='Training acc')
plt.plot(epochs, loss, 'blue', label='Validation loss')
plt.legend()
plt.show()

图:


image.png

loss 损失率

说到loss就要提到损失函数这个概念,损失函数是机器学习中里最基础,最关键的一个要素。损失函数的作用:衡量模型模型预测的好坏。直白点说真实值与预测值差别越大,Loss越大,我们的优化的目标就是减小Loss。损失函数越小,模型就越好。

统计学习中常用的损失函数有以下几种:

(1) 0-1损失函数(0-1 lossfunction):
(2) 平方损失函数(quadraticloss function)
(3) 绝对损失函数(absoluteloss function)
(4) 对数损失函数(logarithmicloss function)或对数似然损失函数(log-likelihood loss function)

loss曲线一些诊断和优化知道

常见情况

1)如果你的 learning_rate_policy 是 step 或者其他变化类型的话, loss 曲线可以帮助你选择一个比较合适的 stepsize。
2)如果loss曲线表现出线性(下降缓慢)表明学习率太低。
3)如果loss不再下降,表明学习率太高陷入局部最小值。
4)曲线的宽度和batch size有关,如果宽度太宽,说明相邻batch间的变化太大,应该减小batch size。

不收敛的问题(如loss为87.3365,loss居高不下等)的情况

1)在caffe中可以在solver里面设置:debug_info: true,看看各个层的data和diff是什么值,一般这个时候那些值不是NAN(无效数字)就是INF(无穷大)。
2)检查数据标签是否从0开始并且连续。
3)把学习率base_lr调低。
4)数据问题,lmdb生成有误。
5)中间层没有归一化,导致经过几层后,输出的值已经很小了,这个时候再计算梯度就比较尴尬了,可以尝试在各个卷积层后加入BN层和SCALE层。
5)把base_lr调低,然后batchsize也调高。
6)把data层的输入图片进行归一化,就是从0-255归一化到0-1。
7)网络参数太多,网络太深,删掉几层看看,可能因为数据少,需要减少中间层的num_output。
8)记得要shuffle数据,否则数据不够随机,几个batch之间的数据差异很小。

出现NAN情况

1)观察loss值的趋势,如果迭代几次以后一直在增大,最后变成nan,那就是发散了,需要考虑减小训练速率,或者是调整其他参数。
2)数据不能太少,如果太少的话很容易发散。
3)Gradient Clipp 处理gradient之后往后传,一定程度上解决梯度爆炸问题。
4)原因可能是训练的时间不够长。
5)可以看一下训练时,网络参数的L2或L1。

acc 准确率

这个比较简单,是真实值和模型预测值是否一致的标量形式。举个通俗的例子:假如真实值是[1,2,3,4,5,6],预测结果是[1,2,3,4,7,8]。比例就是4/6。

loss曲线和acc曲线联合诊断

1)可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr。
2)看第一次test时(即iteration 0),loss和精度,如果太差,说明初始点的设置有问题。
3)过拟合时loss下降,accuracy也下降。

你可能感兴趣的:(keras学习-增加acc曲线和loss曲线绘制)