文章图片
0.什么是训练集、验证集和测试集?
- 训练集(train):训练模型
- 验证集(val):评估模型
- 测试集(test):一旦找到了最佳参数,就开始最终训练
打个比方:我们现在有个任务,但是解决这个任务的网络有网络A、网络B和网络C,如何找到效果最好的哪个?
- 先拿train对三个网络都进行训练(用相同的train训练三个网络),然后用validation来测试三个网络(validation对三个网络也是一样的),我们发现网络B的效果最好,所以我们认为对于本任务,网络B的结构是效果最好的。
- 当然我们现在训练的网络都只是粗训练,现在我们要针对网络B开始精细训练:将train和validation合并组成新的train,现在我们有数据train和test,开始针对B网络精细训练了
1. 简单留出验证的伪代码
num_validation_samples=10000# 验证集样本数
np.random.shuffle(data)# 通常需要打乱数据calidation_data=https://www.it610.com/article/data[:num_calidation_samples]# 定义验证集data=data[num_calidation_samples:]# 截取剩余数据给变量data
training_data=data[:]# 定义训练集:相当于换个名字,实属疑惑,感觉走弯路model=get_model()
model.train(training_data)# 用train训练model
validation_score=model.evaluate(validation_data)# 用val验证得分
现在假设你已经选好了网络模型,开始训练最终模型
文章图片
model=get_model()
model.train(np.concatenate([training_data,validation_data]))# concatenate是拼接Training和Validation为新的Training
test_score=model.evaluate(test_data)# 再使用Test测试得分
总结
以上方法简单易理解,但是缺点也明显:
- 如果样本数量太少,验证集和测试集更少,无法在统计学上代表数据
- 划分数据前时,进行不同的随机打乱则得到的模型性能差别可能很大
- K折验证
- 重复的K折验证
文章图片
如上,当我们不确定多个模型哪个更好时,通过K折验证找到loss最小的。
K折验证时将数据划分为大小相同的K个分区。对于每个分区i,在剩余的K-1个分区上训练模型,然后再分区i上评估模型。最终分数等于K个分数的平均值。
文章图片
k=4
num_validation_samples=len(data)//k# 验计算得证集的样本数np.random.shuffle(data)# 数据打乱validation_scores=[]# 储存每折的验证集得分
for fold in range(k):
validation_data=https://www.it610.com/article/data[num_validation_samples * fold : num_validation_samples * (fold+1)]# 选择验证集分区
training_data=data[:num_validation_samples * fold]+data[num_validation_samples * (fold+1):]#剩余的作为训练集model=get_model()
model.train(training_data)
validation_acore=model.evaluate(validation_data)validation_acores.append(validation_acore)# 将该折的得分储存到分数列表中
validation_score=np.average(validation_scores)# 计算平均值:K折验证分数的均值model=get_model()# 现在训练最终模型
model.train(data)
test_score=model.evaluate(test_data)
3. 重复K折验证
如果可用数据相对较少,而你又需要尽可能精确评估模型,可以选择带有打乱数据的重复K折验证:多次使用K折验证,在每次使用K折验证前都先将数据打乱,最终分数时每次K折验证分数的均值(K折验证分数又是每折的均值)。
推荐阅读
- COVID-19(利用Opencv|COVID-19:利用Opencv, Keras/Tensorflow和深度学习进行口罩检测)
- 深度学习|Keras入门指南Keras入门指南
- Keras|将Pytorch模型迁移到android端(android studio)【未实现】
- nlp|Keras(十一)梯度带(GradientTape)的基本使用方法,与tf.keras结合使用
- 多层LSTM神经网络),出现ValueError: Input 0 is incompatible with layer lstm_21: expected ndim=3, found错误
- 张量、shape、input_shape、秩
- RNN|基于递归神经网络(RNN)的口语理解(SLU)
- Keras搭建神经网络BPNN(回归问题)
- Keras|Keras搭建神经网络BPNN(分类问题)