title
在训练中,我们不仅要做验证集也要做测试集,同时还要监控验证集和测试集情况,以此来控制训练参数,合理进行调参。这里我们可以保存模型,用来断点恢复,不断的调整训练参数,使模型在合适的地方改变学习率,得到最优的模型。下面附一张经典的学习率对于loss的影响
1.欠拟合
首先,我们来看看什么是欠拟合情况。
这里我们把横轴作为epoch,纵轴作为loss,我们可以看到,train,val loss相差很大,这就是所谓的欠拟合。这里我们来分析下欠拟合发生的原因。
欠拟合实际的意思就是我们的模型没有学习到特征,不能和好的表征任务,因此有如下两条解决办法:
——1.减少数据的复杂性,提升数据的相关度
——2.增大模型的复杂度,以此来提升模型的表征能力,同时减少正则项,注意,这里我们减少正则是对应过拟合情况下增加正则。
2.合适拟合
所谓的合适拟合就是数据,参数,模型都是在一个合适情况下,模型效果比较好。
这里注意,有时候有微小的波动很正常,我们要看大范围的loss变化情况。
return_loss = test_handle.val_test_save(model,criterion,val_loader)
val_x.append(epoch)
val_y.append(return_loss)
if minloss > return_loss:
acc = test_handle.evalution(model,128)
print('[%s][%d]Accuracy-Flip: %1.5f' % ("lfwtest", epoch, acc))
torch.save(model.state_dict(), output_dir + "/model_%d" % epoch + ".pt")
plt.figure()
train_x.append(epoch)
train_y.append(loss)
plt.title("train_val_loss_pic")
plt.xlabel("epoch")
plt.ylabel("loss_value")
plt.plot(val_x, val_y, "-s", label='val')
plt.plot(train_x, train_y, "+-", label='train')
plt.legend(bbox_to_anchor=(1.0, 1), loc=1, borderaxespad=0.)
plt.savefig("./train_val_loss_pic.pdf")
这里附上一段代码,用来监控train,val loss,情况。
这里注意,如果我们同时拥有test,val,我们应该选择哪一个最小呢?在此我认为是val,因为对于不同的test有不同的效果,但是验证集是一个相对与训练集来说是一个比较相近的情况,更贴切的表征训练情况。
3.过拟合
这种情况实在我们训练中经常用到的,因此在这里重点进行分析。
过拟合就是,训练loss还在下降,但是val loss 却在上升。
3. 下面是对过拟合的处理办法
转载:https://blog.csdn.net/Mason_Mao/article/details/90474735
3.1正则化
使用l1,l2正则化来对特征进行处理。