深度学习,训练注意事项

title

在训练中,我们不仅要做验证集也要做测试集,同时还要监控验证集和测试集情况,以此来控制训练参数,合理进行调参。这里我们可以保存模型,用来断点恢复,不断的调整训练参数,使模型在合适的地方改变学习率,得到最优的模型。下面附一张经典的学习率对于loss的影响


image.png

1.欠拟合

首先,我们来看看什么是欠拟合情况。


欠拟合.png

这里我们把横轴作为epoch,纵轴作为loss,我们可以看到,train,val loss相差很大,这就是所谓的欠拟合。这里我们来分析下欠拟合发生的原因。

欠拟合实际的意思就是我们的模型没有学习到特征,不能和好的表征任务,因此有如下两条解决办法:

——1.减少数据的复杂性,提升数据的相关度

——2.增大模型的复杂度,以此来提升模型的表征能力,同时减少正则项,注意,这里我们减少正则是对应过拟合情况下增加正则。

2.合适拟合

所谓的合适拟合就是数据,参数,模型都是在一个合适情况下,模型效果比较好。


image.png

这里注意,有时候有微小的波动很正常,我们要看大范围的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.过拟合

这种情况实在我们训练中经常用到的,因此在这里重点进行分析。


image.png

过拟合就是,训练loss还在下降,但是val loss 却在上升。

3. 下面是对过拟合的处理办法

转载:https://blog.csdn.net/Mason_Mao/article/details/90474735

3.1正则化

使用l1,l2正则化来对特征进行处理。

3.2 数据集扩充

3.3Dropout

3.4 提前停止迭代,但是要注意选择最好的模型

3.5 对数据进行预处理,平衡不同类的数据

你可能感兴趣的:(深度学习,训练注意事项)