最早训练神经网络的时候完全什么技巧都不懂,能成功运行开源代码,并且看到loss下降就放心跑着了。随着对网络越来越多的接触,发现从数据集(train/val/test)的准备到训练超参数(例如args或者config文件)的设置都逐渐会根据经验去进行设计了。从来没有细细梳理过每一个训练小trick和其背后的依据,因此以边梳理边学习的态度,根据个人和网站上大家的总结对深度网络的训练进行了整理。
数据集的准备
1. 数据集划分
![](https://img-blog.csdnimg.cn/2020041419273713.png)
深度网络是从数据中进行学习/训练的一个模型,因此数据集对于网络的训练至关重要。尽管训练集通常只是样本空间的一个很小的采样,我们仍希望它能很好地反映出样本空间的特性,从而使得模型具有鲁棒性和泛化能力。训练中出现过拟合或者欠拟合现象会导致模型的泛化能力降低,因此还需要测试集来评估泛化能力。一般在实际应用时,测试集用来考核我们的模型最终是否能达到指标,通常会被给定,并且在监督训练中有时不提供ground truth/label。
为了在我们自己的实验中达到评估模型的目的,我们会专门在所有训练数据集中选出和测试集功能一样的验证集。验证集的挑选原则(1)应该尽可能与训练集互斥, 即样本尽量不在训练集中出现、未在训练过程中使用过;(2)要尽可能与训练集保持数据分布的一致性,例如在分类任务中至少要保持样本的类别比例相似。那么如何在一个未分配的数据集上划分训练集和验证集