训练过程--对loss和acc的分析、处理。

训练过程–对loss和acc的分析、处理。

转载自https://blog.csdn.net/wydbyxr/article/details/84852672:
计算loss是会把所有的loss层的loss相加。

从验证集误差和测试集误差的角度分析

其实你这个问题就是个伪命题,如果我们刻意的去在训练集上拟合模型,使其准确率达到很高的高度,或者说尽量在验证集合上表现的好,都是相悖的。
  因为我们不能为了某一特定数据集来刻意拟合,因为模型预测数据是不一定就在这个训练或者验证集合的空间中。
  还有,如果这个model预测集合acc20% 训练集合acc19% (即训练集精度低于测试集精度),那么这个模型肯定是不好的。
  还有一点需要注意,就是千万不能为了拟合测试集合而去更改模型,测试集合应该每次都有不同。

那么如何选取一个较为理想的model?

首先,要有一个期望的准确率,通过不同模型的实验,找到最能接近的;
  然后,选定模型后进行参数调优;
  那么我们要尽可能的提高model的准确率,同时提高其泛化的能力,不能单一看某一指标,此时可参考 准确率、召回率、虚警率、F1Score等指标综合评判。或者采用多重验证随机划分训练、预测、验证集合,多次随机后找到最优参数。

有时候训练集合误差很低,但是泛化能力极差,产生过拟合,
  有时候验证集合误差很低,但是可能验证集合无法代表所有的样本,有特殊性或者其他异常点较多。
  所以模型问题不能单一从你这两点来评判。

一般而言,训练集loss < 验证集loss <测试集loss

因为网络 [已见过] 所有训练集samples,故最低。而网络用验证集作为反馈来调节参数,相当于参考了验证集samples中的信息(间接 [已见过])。又因为网络没有任何测试集的信息,所以测试结果一般而言最差。
  不过这都不是绝对的,有不符合这个一般现象的task,而我们不可以说哪种情况更“好”。
  多数情况验证集上错误率更低一点。因为是选择在验证集上准确率最高的模型来进行测试。考虑到数据的随机性,在验证集上准确率最高的模型在测试集上不一定是最高的,所以算出来的指标通常验证集会比测试集上好一点。

但是实际情况下都有可能,特别是数据量不太大的时候。样本集合的数据也只是近似整体的分布,肯定会有波动。

一个好的网络,二者的差距应该是很低的。但一般情况下因为网络不可避免地存在一定程度上的过拟合,所以肯定是train_loss低于test_lost,但如果低太多,就得考虑是过拟合的问题还是因为样本的特征空间不统一的问题。

一般训练集不大时,最终训练的网络及容易过拟合,也就是说train-loss一定会收敛,但是test-loss不会收敛;

训练时的loss会低于test的loss大概1~2个数量级,通常是10倍左右。

单独观察训练集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,使用的参数是:

// An highlighted block
transform_param{
casle:0.00390625//像素归一化,1/255
}

7)网络参数太多,网络太深,删掉几层看看,可能因为数据少,需要减少中间层的num_output;
  8)记得要shuffle数据,否则数据不够随机,几个batch之间的数据差异很小。

loss出现NAN

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

联合观察loss曲线和acc

1)单独的 loss 曲线能提供的信息很少的,一般会结合测试机上的 accuracy 曲线来判断是否过拟合;
  2)关键是要看你在测试集上的acc如何;
  3)可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了;
  4)看第一次test时(即iteration 0),loss和精度,如果太差,说明初始点的设置有问题
  5)使用caffe时,train时,看见的loss是训练集的;accuracy才是测试集的
  6)所谓的过拟合是:loss下降,accuracy也下降

你可能感兴趣的:(深度学习)