对于深度学习中训练集(train set)验证集(validation set)和测试集(test set)的理解

实验中网络训练集,测试集,验证集的功能

本文用两个流程图来解释如何更好的区分训练集验证集以及测试集的功能



前言

在深度学习的深坑中,刚入手的小伙伴们做实验的时候会傻傻分不清楚训练集,测试集和验证集到底该在实验的哪一部分使用,功能是什么,所有就写了这篇博文,供自己学习也分享给大家


一、训练集验证集和测试集的理论解释

很多机器学习过程实际上就是选择模型,由于模型只是参数未知,所以就需要得到一个最优参数,使得模型可以比较准确的描述自变量到因变量的变化情况。对于模型的训练和度量,就需要用到已知的数据集。

数据集一般分为以下3种。如果已经有了一个大的标注数据集,那么通过随机抽样获得三种数据集,三者的比例为8:1:1。如果有标注的话,也可以只随机抽样出训练集和验证集。如果无标注,就用作训练集。

通常的方法就是先训练训练集,即最小化代价函数,然后再把测试集代入代价函数看看效果如何。

1.训练集
确定模型后,用于训练参数,注意训练的是普通参数(每多加入一个数据对模型进行训练,模型中就会受到影响的参数,通过多次迭代不断更新,是一个梯度下降的过程)而不是超参数(超参数是指训练开始之前设置的参数,超参数的选择与训练过程实际上是独立的,训练过程不会影响超参数。但是训练结束后可以根据训练结果考虑超参数是否可优化,可优化的话就调整超参数的值开始下一次训练)

PS:参数分为普通参数和超参数,在不引入强化学习的前提下普通参数可以被梯度下降更新,也就是训练参数。另外就是超参数的概念,比如网络节点数,网络层数,学习率,迭代次数等等。这些不在梯度下降的参数更新的范围内。

2.验证集(交叉验证集CV)
验证集基本是在每个epoch完成后,用来测试一下当前模型的准确率,不是训练模型的参数。

从狭义上来讲,验证集是没有参与梯度下降的过程,也就是说没有经过训练,但从广义上来说,验证集却参与了一个“人工调参”的过程,根据验证集的结构调整了迭代数,学习率等等,使得在验证集上最优。因此也可以说验证集也参与了训练。

3.测试集
虽然验证集没有对模型的参数产生影响,但是我们却根据验证集的测试结果的准确度来调整超参数,所以验证集对结果还是有影响的,即使得模型在验证集上达到最优。就是在很多个模型中,验证集选择了代价函数最小的一个模型。虽然在这个模型上代价很小,但并不代表在其他数据上代价也小。所以需要一个完全没有经过训练的测试集来再最后测试模型的准确率。由于验证集和测试集没有交集。所以这个准确率是准确的。

二、流程图解释

1.在论文Convolutional Neural Networks for Recognition of Lymphoblast Cell Images中的流程图

细胞图片分为三部分,训练集测试集和验证集,我们使用训练集中的数据训练ConVNet,以在三个卷积子层中找到合适的滤波器权重,并在两个完全连接的层中找到最小误差的权重。接下来,我们使用验证集中的数据评估ConVNet,以获得验证误差和交叉熵损失。然后,我们使用从原始121个训练图像的数据扩充中创建的新训练集再次训练ConVNet。我们以相同的过程重复ConVNet的训练,直到完成50个纪元。最后,我们使用测试集中的数据评估ConVNet的性能。
在这里插入图片描述

2.实际应用中

一般只分为训练集和测试集
以对腹部CT图像中肺部肿瘤分割为例,流程图自己画的,哪里不对积极改正
在这里插入图片描述

总结

训练集:学习样本数据集,通过匹配一些参数建立一个分类器,主要是用来训练模型的。

验证集:对学习出来的模型,调整超参数。

测试集:测试集训练好的模型的准确率

  • 14
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在OpenCV,可以使用cv::imread函数来读取图像数据,同时可以使用cv::glob函数来获取指定目录下的所有图像文件。在加载数据集时,一般需要将数据集随机划分为训练集测试集验证集三部分。可以通过使用C++ STL的随机数生成函数std::shuffle来随机打乱数据集,并按照比例划分为三部分。具体实现可以参考以下代码: ``` #include <opencv2/opencv.hpp> #include <algorithm> #include <iostream> #include <vector> using namespace cv; using namespace std; int main() { // 定义存储图像路径的向量 vector<String> img_paths; // 获取指定目录下的所有jpg格式文件 glob("path/to/images/*.jpg", img_paths, false); // 打乱图像路径的顺序 random_shuffle(img_paths.begin(), img_paths.end()); // 划分训练集测试集验证集 int n = img_paths.size(); int train_num = n * 0.6; // 训练集占60% int test_num = n * 0.2; // 测试集占20% int val_num = n - train_num - test_num; // 验证集占剩下的20% vector<String> train_paths(img_paths.begin(), img_paths.begin() + train_num); vector<String> test_paths(img_paths.begin() + train_num, img_paths.begin() + train_num + test_num); vector<String> val_paths(img_paths.begin() + train_num + test_num, img_paths.end()); // 输出各部分数据集的大小 cout << "Train set size: " << train_num << endl; cout << "Test set size: " << test_num << endl; cout << "Validation set size: " << val_num << endl; return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值