【深度学习】给定比例随机划分训练集、验证集和测试集(同时划分Images和labels)

本文介绍了如何使用Python脚本按比例划分数据集为训练集、验证集和测试集,以避免过拟合,同时详细展示了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在处理数据集的时候需要一个脚本,可以按需要的比例,随机划分训练集(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)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值