本文主要是介绍神经网络训练多个epoch,写论文的时候可以取最好的效果那一个epoch作为结果吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
论文中一般都是用在**验证集上效果最好的模型去预测测试集,多次预测的结果取平均计算准确率或者mAP值而不是单纯的取一次最好的结果作为论文的结果。**如果你在写论文的过程中,把测试集当做验证集去验证的话,这其实是作假的,建议不要这样,一旦有人举报或者复现出来你的结果和你论文中的结果相差很大的话,是会受到很大处分的。
我之前曾遇到过这种情况,我在图像分类的过程中曾经用过CutMix增强方式,CutMix其实就是将两张图片放在一起,如下图所示,这种结果会造成验证集上准确率很大的波动,可能一会儿变成99%,一会儿变成88%,那我总不能拿99%作为我论文中的结果啊,所以还是要以最终的测试集的准确率为主,因为这个才是我们需要关注的。
如果只是单纯的取提高准确率的话可以看看文中下面的一些方式,这些方式的提升一定会比单纯取最好的模型的效果要好的。
首先我们需要理解一下概念**,什么是训练集?什么是验证集?什么是测试集?**大家很容易将“验证集”与“测试集”,“交叉验证”混淆。
首先我们来了解一下基本的概念哈,然后在分析如何解决分类问题,提高模型的准确率和泛化能力。
训练集、验证集、测试集
训练集(train set) —— 用于模型拟合的数据样本。
验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
一个形象的比喻:
**训练集:**学生的课本;学生 根据课本里的内容来掌握知识。
**验证集:**作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。
**测试集:**考试,考的题是平常都没有见过,考察学生举一反三的能力。
为什么验证数据集和测试数据集两者都需要?
因为验证数据集(Validation Set)用来调整模型参数从而选择最优模型,模型本身已经同时知道了输入和输出,所以从验证数据集上得出的误差(Error)会有偏差(Bias)。
但是我们只用测试数据集(Test Set) 去评估模型的表现,并不会去调整优化模型。
传统上,一般三者切分的比例是:6:2:2,验证集并不是必须的即验证集可有可无。
2.K-折交叉验证(K-fold Cross Validation,记为K-CV)
就按照作者说的10折交叉来说,算法步骤是(图如1):
-
将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率。
-
10次的结果的正确率的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。
在数据缺乏的情况下使用,如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,故LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。
优点:
(1)每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
(2)实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。
缺点:
计算成本高,需要建立的模型数量与原始数据样本数量相同。当数据集较大时几乎不能使用。
3. 关于保存最优的模型
1. keras 保存最佳的训练模型:
from keras.callbacks import ModelCheckpointfilepath='weights.best.hdf5'# 有一次提升, 则覆盖一次.
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1,save_best_only=True,mode='max',period=2) callbacks_list = [checkpoint]model.compile(loss='categorical_crossentropy', optimizer=optimizers.Adam(lr=2e-6,decay=1e-7),metrics=['acc'])history1 = model.fit_generator(train_generator,steps_per_epoch=100,epochs=40,validation_data=validation_generator,validation_steps=100, callbacks=callbacks_list)
注:TensorFlow2.0的写法和Keras差不多。
2. Pytroch保存最优的训练模型:
min_loss = 100000#随便设置一个比较大的数for epoch in range(epochs):train()val_loss = val()if val_loss < min_loss:min_loss = val_lossprint("save model")torch.save(net.state_dict(),'model.pth')
这篇关于神经网络训练多个epoch,写论文的时候可以取最好的效果那一个epoch作为结果吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!