“炼丹”之数据组成

本文最后更新于:2022年7月5日 下午

“炼丹”之数据组成

待机器进行学习的标注数据被送入火炉前会被分为:训练集、验证集、测试集。三者发挥自己的作用对网络模型进行构建、筛选调整以及评估。主干网络的骨架在训练阶段利用训练集的特征拟合了模型的血和肉,训练的过程并不会用到测试集和验证集。验证集主要用来评估迭代训练时当前模型泛化能力(准确率,召回率等),以决定是否停止继续训练。在神经网络中, 我们用验证数据集去寻找最优的网络深度,或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;

类别 验证集 测试集
作用 纯粹用于调超参数 纯粹为了加试以验证泛化性能
使用次数 多次使用,以不断调参 仅仅一次使用
用于训练

两者的缺陷:模型在一次次重新手动调参并继续训练后所逼近的验证集,可能只代表一部分非训练集,导致最终训练好的模型泛化性能不够 测试集为了具有泛化代表性,往往数据量比较大,测试一轮要很久,所以往往只取测试集的其中一小部分作为训练过程中的验证集

互相转化:验证集具有足够泛化性(一般来说,如果验证集足够大到包括大部分非训练集时,也等于具有足够泛化性了)验证集具有足够泛化性时,测试集就没有存在的必要

训练集和测试集的划分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
print("Generate txt in ImageSets.")
xmlfilepath = os.path.join(VOCdevkit_path, 'VOC2007/Annotations')
saveBasePath = os.path.join(VOCdevkit_path, 'VOC2007/ImageSets/Main')
temp_xml = os.listdir(xmlfilepath) #传入xml文件的路径,返回该目录下的所有xml文件名
total_xml = []
for xml in temp_xml:
if xml.endswith(".xml"):
total_xml.append(xml) #添加每个xml文件

num = len(total_xml)
list = range(num) #返回xml文件列表
tv = int(num*trainval_percent)
tr = int(tv*train_percent)
trainval= random.sample(list,tv)
train = random.sample(trainval,tr)

print("train and val size",tv)
print("train size",tr)
ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')
fval = open(os.path.join(saveBasePath,'val.txt'), 'w')

range函数返回一个range类型的整数序列,一般用在循环结构中。

参数名称 说明 备注
start 计数起始位置 整数参数,可省略。省略时默认从0开始计数
stop 计数终点位置 不可省略的整数参数。计数迭代的序列中不包含stop
step 步长 可省略的整数参数,默认时步长为1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for i in list:  
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
print("Generate txt in ImageSets done.")

参考:

训练集、验证集、测试集以及交验验证的理解

验证集和测试集有什么区别?

深度学习: 验证集 & 测试集 区别