在实际项目中,经常会遇到各种各样的问题,其中有几个典型的训练问题,需要重点注意。
1. 学习率太高
学习率太高会出现非常大的valid_loss。eg:
learn = create_cnn(data, models.resnet34, metrics=error_rate)
learn.fit_one_cycle(1, max_lr=0.5)
image.png
出现了这种情况,我们别无他法,只能使用更小的lr,从新开始训练模型。
2. 学习率太低
学习率太低的一个重要特点是,train_loss下降的速度非常慢,很平缓,而且train_loss一直位于valid_loss上方,表明是一种欠拟合的状态。比如:
learn = create_cnn(data, models.resnet34, metrics=error_rate)
learn.fit_one_cycle(5, max_lr=1e-5)
如果用图片展示,可以看到:
所以这种情况,就是学习率太小导致的欠拟合状态,我们要10倍或100倍的提高lr,重新训练。
3. epochs太少
epochs太少就是模型训练得太少,还没有训练够,所以出现了train loss要比valid_loss还要大的情况。所以太少的epoch和太小的lr的结果是相似的,都是欠拟合状态。这时需要增加lr或增加epochs来训练。
4. epochs太多
epochs太多时,容易出现过拟合,过拟合的现象是,error_rate下降之后,开始上升了。这时的上升说明开始出现了过拟合,说明模型已经偏向于记住train set中的特点而不是学习到通用的特征。
有的人认为:如果train loss比valid loss低,那就是过拟合,但其实这种说法并不完全正确,一般的,任何一个正确的训练模型的train loss都要比valid loss更低,所以这并不能说明出现了过拟合。
所以过拟合的标志是:error_rate开始变得更糟糕,这时才表明出现了过拟合。
下面的结果就是epochs太多导致的过拟合:
epoch train_loss valid_loss error_rate time
0 1.281925 1.141897 0.694323 00:07
1 1.346654 1.129421 0.694323 00:03
2 1.340803 1.107458 0.681223 00:03
3 1.355779 1.085071 0.646288 00:03
4 1.295381 1.050753 0.589520 00:03
5 1.224308 1.000656 0.497817 00:03
6 1.159185 0.938931 0.397380 00:03
7 1.088768 0.867412 0.310044 00:03
8 1.008123 0.788017 0.231441 00:03
9 0.938289 0.708754 0.157205 00:03
10 0.864608 0.634222 0.122271 00:03
11 0.793969 0.566193 0.096070 00:03
12 0.733825 0.508754 0.082969 00:03
13 0.680985 0.458568 0.069869 00:03
14 0.632074 0.418085 0.061135 00:03
15 0.589376 0.385271 0.056769 00:03
16 0.551403 0.356482 0.056769 00:03
17 0.516843 0.330840 0.052402 00:03
18 0.485706 0.311566 0.052402 00:03
19 0.457809 0.295450 0.052402 00:03
20 0.432226 0.281761 0.052402 00:03
21 0.408979 0.269984 0.052402 00:03
22 0.387673 0.259906 0.048035 00:03
23 0.368162 0.251425 0.039301 00:03
24 0.350114 0.245693 0.034934 00:03
25 0.333477 0.238942 0.034934 00:03
26 0.318159 0.232099 0.030568 00:03
27 0.303887 0.226424 0.030568 00:03
28 0.290654 0.222446 0.030568 00:03
29 0.278258 0.218786 0.034934 00:03
30 0.266660 0.215658 0.030568 00:03
31 0.255738 0.214105 0.030568 00:03
32 0.245596 0.209824 0.030568 00:03
33 0.236173 0.205443 0.034934 00:03
34 0.227359 0.204399 0.030568 00:03
35 0.218893 0.202812 0.030568 00:03
36 0.210922 0.202212 0.039301 00:03
37 0.203402 0.201633 0.039301 00:03
38 0.196221 0.201402 0.039301 00:03
39 0.189409 0.201313 0.039301 00:03
可以看到,error_rate从epoch 29之后就慢慢的出现了过拟合。
网友评论