赞
踩
简单说,训练集就是用来训练模型用的,验证集为了验证模型的效果, 测试集用来最终评测。所以基于这个,那训练数据的时候,就不要使用验证集和测试集的相关信息,包括统计均值方差特征等, 但是验证集可以在模型训练过程中进行模型调参,就是手动调一些外部参数,像是epoch、learning rate、 dropout prob等。
详细介绍下,参考:https://blog.csdn.net/ytusdc/article/details/86488537
训练集(train set) —— 用于模型拟合的数据样本。在训练过程中对训练误差进行梯度下降,进行学习,可训练的权重参数。
验证集(validation set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
验证集可以用在训练的过程中,一般在训练时,几个epoch结束后跑一次验证集看看效果。(验证得太频繁会影响训练速度)这样做的第一个好处是,可以及时发现模型或者参数的问题,比如模型在验证集上发散啦、出现很奇怪的结果啦(如无穷大)、mAP不增长或者增长很慢啦等等情况,这时可以及时终止训练,重新调参或者调整模型,而不需要等到训练结束。另外一个好处是验证模型的泛化能力,如果在验证集上的效果比训练集上差很多,就该考虑模型是否过拟合了。同时,还可以通过验证集对比不同的模型。在一般的神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;
由于验证集是用来”训练”超参数的,尽管验证集的误差通常会比训练集误差小,一般来说验证集比较小会低估泛化误差。所有超参数优化完成之后,泛化误差可能会通过测试集来估计。
在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。
测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
1)验证集是一定需要的;
1)针对超参的选择我们是根据验证集上的效果来进行调整的,因此验证集可以看做参与到“人工调参”的训练过程;
2)注意训练集、验证集和测试集应该服从同一数据分布,这样我们才能进行玄学调参;
3)测试集的存在只是为了验证我们在训练集和验证集(通常验证集只是非训练集一个小子集)上进行模型的超参和参数训练后,验证我们得到的模型是否具有泛化性能,再做一次确认。如果验证集具有足够泛化代表性,测试集是可以没有的,但验证集是必须有的。
验证集的作用:
在每一步训练之后,计算 validation_data
的分类精度。一旦 validation_data
的分类精度达到饱和,就停止训练。这种策略叫做提前终止(early stopping)。为什么要用 validation_data
而不是 test_data
来防止过拟合呢?通过 validation_data
来选择不同的超参数(例如,训练步数、学习率、最佳网络结构、等等)是一个普遍的策略。我们通过这样的评估来计算和设置合适的超参数值。
当然,上面的解释不能回答为什么我用 validation_data
而不是 test_data
来防止过拟合。如果基于 test_data
的评估结果设置超参数,有可能我们的网络最后是对 test_data
过拟合。也就是说,我们或许只是找到了适合 test_data
具体特征的超参数,网络的性能不能推广到其它的数据集。通过 validation_data
来设置超参数能够避免这种情况的发生。然后,一旦我们得到了想要的超参数,就用 test_data 做最后的精度评估。这让我们相信
test_data的精度能够真正提现网络的泛化能力。换句话说,你能把
validation_data视为帮助我们学习合适超参数的一种训练数据。由于
validation_data和
test_data` 是完全分离开的,所以这种找到优秀超参数的方法被称为分离法(hold out method)
- for epoch in range(FLAGS.num_train_epochs):
- for step, batch in tqdm(enumerate(batches)):
- train_step(x_batch, y_batch)
- f1_micro, f1_macro, acc, loss = valid(x_valid, y_valid)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。