在处理数据集的时候需要一个脚本,可以按需要的比例,随机划分训练集(train)、验证集(val)、测试集(test)。
一、数据集可以拆分为三个子集:训练集、验证集、测试集。
1. 在训练集上进行训练,然后使用测试集对模型进行测试并观察其指标,根据在测试集上获得的效果调整模型。
2. 模型调整包括:更改学习速率、添加或移除特征、设计新模型等一系列的手工调整。
3. 训练集参与模型的学习,不能反映模型的真实能力。
4. 测试集参与手工调参,也不能反应模型的真实能力。
5. 所以增加验证集考察模型的真实能力。
6. 只有数据集和测试集就会出现过拟合的现象。
二、代码部分
import os
import shutil
import random
import os.path as osp
def split_datasets(input_folder1, input_folder2, output_folder1, output_folder2, train_ratio=0.7, val_ratio=0.15, test_ratio=0.15, random_seed=None):
"""
分别将两个文件夹(Images、labels)中的数据集按比例划分为训练集、验证集和测试集,并保存到指定文件夹中
参数:
- input_folder1: 第一个输入数据集所在的文件夹路径
- input_folder2: 第二个输入数据集所在的文件夹路径
- output_folder1: 第一个输出文件夹的根路径,将在其中创建三个子文件夹:train、val和test
- output_folder2: 第二个输出文件夹的根路径,将在其中创建三个子文件夹:train、val和test
- train_ratio: 训练集比例
- val_ratio: 验证集比例
- test_ratio: 测试集比例
- random_seed: 随机数种子,可选
"""
# 处理第一个数据集
process_dataset(input_folder1, output_folder1, train_ratio, val_ratio, test_ratio, random_seed)
# 处理第二个数据集
process_dataset(input_folder2, output_folder2, train_ratio, val_ratio, test_ratio, random_seed)
def process_dataset(input_folder, output_folder, train_ratio, val_ratio, test_ratio, random_seed):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
train_folder = osp.join(output_folder, 'train')
val_folder = osp.join(output_folder, 'val')
test_folder = osp.join(output_folder, 'test')
os.makedirs(train_folder, exist_ok=True)
os.makedirs(val_folder, exist_ok=True)
os.makedirs(test_folder, exist_ok=True)
# 获取文件列表
file_list = os.listdir(input_folder)
random.seed(random_seed)
random.shuffle(file_list)
# 划分数据集
num_files = len(file_list)
num_train = int(num_files * train_ratio)
num_val = int(num_files * val_ratio)
num_test = int(num_files * test_ratio)
train_files = file_list[:num_train]
val_files = file_list[num_train:num_train + num_val]
test_files = file_list[num_train + num_val:]
# 将文件复制到相应的文件夹
for file in train_files:
base_name, ext = osp.splitext(file) # 获取文件名和扩展名
shutil.copy(osp.join(input_folder, file), osp.join(train_folder, file))
for file in val_files:
base_name, ext = osp.splitext(file) # 获取文件名和扩展名
shutil.copy(osp.join(input_folder, file), osp.join(val_folder, file))
for file in test_files:
base_name, ext = osp.splitext(file) # 获取文件名和扩展名
shutil.copy(osp.join(input_folder, file), osp.join(test_folder, file))
# 使用示例
if __name__ == "__main__":
input_folder1 = "E:\yolov3-master\datasets\Images"
input_folder2 = "E:\yolov3-master\datasets\labels"
output_folder1 = "E:\yolov3-master\datasets\image" # 修改输出文件夹为当前工作目录下的output1文件夹
output_folder2 = "E:\yolov3-master\datasets\label" # 修改输出文件夹为当前工作目录下的output2文件夹
split_datasets(input_folder1, input_folder2, output_folder1, output_folder2, train_ratio=0.7, val_ratio=0.15, test_ratio=0.15, random_seed=42)