Python实现数据集自动划分的示例代码(训练集/验证集/测试集)

 更新时间:2026年04月02日 09:41:16   作者:CV小涵  
本文提供了一段Python脚本,用于自动将数据集按照指定比例划分为训练集、验证集和测试集,并保证结果可复现,脚本涵盖了目录设置、文件读取与划分、文件复制及结果输出等步骤,适用于深度学习模型的训练与评估,需要的朋友可以参考下

在深度学习模型训练中,我们通常需要将数据集划分为训练集(Train)、验证集(Val)和测试集(Test)。训练集用于模型参数学习,验证集用于超参数调优,测试集用于评估模型最终泛化能力。手动划分不仅效率低,还难以保证随机性,这里分享一段自动划分数据集的 Python 脚本。

代码功能说明

这段代码的核心功能是:将原始数据集中的图片和对应标签,按照 8:1:1 的比例随机划分为训练集、验证集和测试集,并分别存放于对应目录中,同时保证划分结果可复现。

代码如下

import os
import random
import shutil
# 分割训练集和验证集
# 设置随机种子以保证结果可复现
random.seed(42)

# 数据集根目录
data_dir = './datasets'

images_dir = os.path.join(data_dir, 'images')
labels_dir = os.path.join(data_dir, 'labels')

# 创建目录
os.makedirs(os.path.join(images_dir, 'train'), exist_ok=True)
os.makedirs(os.path.join(images_dir, 'val'), exist_ok=True)
os.makedirs(os.path.join(labels_dir, 'train'), exist_ok=True)
os.makedirs(os.path.join(labels_dir, 'val'), exist_ok=True)
os.makedirs(os.path.join(images_dir, 'test'), exist_ok=True)
os.makedirs(os.path.join(labels_dir, 'test'), exist_ok=True)

# 获取所有的图像文件名
image_files = [f for f in os.listdir(os.path.join(data_dir, 'images')) if f.endswith('.jpg')]

# 计算训练集和验证集的大小
train_ratio = 0.8
val_ratio = 0.1
test_ratio = 0.1
total_images = len(image_files)
train_index = int(total_images * train_ratio)
val_index = int(total_images * (train_ratio + val_ratio))

# 打乱文件列表
random.shuffle(image_files)

# 划分数据集
train_images = image_files[:train_index]
val_images = image_files[train_index:val_index]
test_images = image_files[val_index:]


for img_file in train_images:
    label_file = img_file.replace('.jpg', '.txt')
    shutil.copy(os.path.join(data_dir, 'images', img_file), os.path.join(images_dir, 'train'))
    shutil.copy(os.path.join(data_dir, 'labels', label_file), os.path.join(labels_dir, 'train'))

for img_file in val_images:
    label_file = img_file.replace('.jpg', '.txt')
    shutil.copy(os.path.join(data_dir, 'images', img_file), os.path.join(images_dir, 'val'))
    shutil.copy(os.path.join(data_dir, 'labels', label_file), os.path.join(labels_dir, 'val'))

for img_file in test_images:
    label_file = img_file.replace('.jpg', '.txt')
    shutil.copy(os.path.join(data_dir, 'images', img_file), os.path.join(images_dir, 'test'))
    shutil.copy(os.path.join(data_dir, 'labels', label_file), os.path.join(labels_dir, 'test'))

print(f"数据集划分完成!训练集: {len(train_images)},验证集: {len(val_images)},测试集: {len(test_images)}")
import sys
sys.exit(0)

代码解析

1. 导入依赖库

首先导入必要的 Python 库,os用于文件路径操作,random用于随机打乱文件列表,shutil用于文件复制:

import os
import random
import shutil

2. 保证结果可复现

设置随机种子,确保每次运行代码的划分结果一致(便于实验对比):

random.seed(42)  # 固定种子,结果可复现

3. 目录设置与创建

定义数据集根目录及图片、标签存放路径,并自动创建划分后的子目录(train/val/test):

# 数据集根目录
data_dir = './datasets'
images_dir = os.path.join(data_dir, 'images')  # 原始图片目录
labels_dir = os.path.join(data_dir, 'labels')  # 原始标签目录

# 创建划分后的子目录(若已存在则不报错)
os.makedirs(os.path.join(images_dir, 'train'), exist_ok=True)
os.makedirs(os.path.join(images_dir, 'val'), exist_ok=True)
os.makedirs(os.path.join(images_dir, 'test'), exist_ok=True)
os.makedirs(os.path.join(labels_dir, 'train'), exist_ok=True)
os.makedirs(os.path.join(labels_dir, 'val'), exist_ok=True)
os.makedirs(os.path.join(labels_dir, 'test'), exist_ok=True)

4. 读取与划分文件

获取所有图片文件,按比例划分并随机打乱:

# 获取所有.jpg格式的图片文件(可根据实际格式修改)
image_files = [f for f in os.listdir(images_dir) if f.endswith('.jpg')]

# 定义划分比例(可根据需求调整)
train_ratio = 0.8  # 训练集占比
val_ratio = 0.1    # 验证集占比
test_ratio = 0.1   # 测试集占比

# 计算各集合的文件数量
total_images = len(image_files)
train_index = int(total_images * train_ratio)  # 训练集结束索引
val_index = int(total_images * (train_ratio + val_ratio))  # 验证集结束索引

# 随机打乱文件列表(保证划分随机性)
random.shuffle(image_files)

# 划分数据集
train_images = image_files[:train_index]       # 训练集
val_images = image_files[train_index:val_index]  # 验证集
test_images = image_files[val_index:]          # 测试集

5. 复制文件到对应目录

将图片和对应的标签文件(假设标签与图片同名,后缀为.txt)复制到划分后的目录:

# 复制训练集文件
for img_file in train_images:
    label_file = img_file.replace('.jpg', '.txt')  # 标签文件名(与图片对应)
    shutil.copy(os.path.join(images_dir, img_file), os.path.join(images_dir, 'train'))
    shutil.copy(os.path.join(labels_dir, label_file), os.path.join(labels_dir, 'train'))

# 复制验证集文件(逻辑同上)
for img_file in val_images:
    label_file = img_file.replace('.jpg', '.txt')
    shutil.copy(os.path.join(images_dir, img_file), os.path.join(images_dir, 'val'))
    shutil.copy(os.path.join(labels_dir, label_file), os.path.join(labels_dir, 'val'))

# 复制测试集文件(逻辑同上)
for img_file in test_images:
    label_file = img_file.replace('.jpg', '.txt')
    shutil.copy(os.path.join(images_dir, img_file), os.path.join(images_dir, 'test'))
    shutil.copy(os.path.join(labels_dir, label_file), os.path.join(labels_dir, 'test'))

6. 输出划分结果

打印各集合的文件数量,确认划分完成:

print(f"数据集划分完成!训练集: {len(train_images)},验证集: {len(val_images)},测试集: {len(test_ima

使用说明

  1. 目录结构要求:原始数据集需按如下结构存放(可修改代码中data_dir路径适配你的数据):
datasets/
├─ images/  # 存放所有图片(.jpg格式)
└─ labels/  # 存放所有标签(.txt格式,与图片同名)
  1. 格式适配:若图片格式为.png 等,需修改endswith('.jpg')为对应格式;标签格式不同时同理。
  2. 比例调整:修改train_ratioval_ratiotest_ratio可自定义划分比例。

以上就是Python实现数据集自动划分的示例代码(训练集/验证集/测试集)的详细内容,更多关于Python数据集自动划分的资料请关注脚本之家其它相关文章!

相关文章

  • Python入门之字典的使用教程

    Python入门之字典的使用教程

    Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。本文将为大家详细讲讲字典的使用教程,需要的可以参考一下
    2022-09-09
  • Python中字符串转换为列表的常用方法总结

    Python中字符串转换为列表的常用方法总结

    本文将详细介绍Python中将字符串转换为列表的八种常用方法,每种方法都具有其独特的用途和适用场景,文中的示例代码讲解详细,感兴趣的可以了解下
    2023-11-11
  • 将Python应用部署到生产环境的小技巧分享

    将Python应用部署到生产环境的小技巧分享

    文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完善、文档更新、环境搭建、自动化流水线、性能调优、监控与告警、安全加固以及故障恢复
    2025-01-01
  • Python常见文件操作的函数示例代码

    Python常见文件操作的函数示例代码

    Python常见文件操作的函数示例代码,学习python的朋友可以参考下。
    2011-11-11
  • python如何实现int函数的方法示例

    python如何实现int函数的方法示例

    int()函数常用来把其他类型转换为整数,下面这篇文章主要给大家介绍了关于python如何实现int函数的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-02-02
  • 基于pygame实现童年掌机打砖块游戏

    基于pygame实现童年掌机打砖块游戏

    这篇文章主要为大家详细介绍了基于pygame实现童年掌机打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Python实现自动装机功能案例分析

    Python实现自动装机功能案例分析

    这篇文章主要介绍了Python实现自动装机功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • python装饰器使用方法实例

    python装饰器使用方法实例

    这篇文章主要介绍了python装饰器的使用方法,大家参考使用
    2013-11-11
  • Python中顺序表的实现简单代码分享

    Python中顺序表的实现简单代码分享

    这篇文章主要介绍了Python中顺序表的实现简单代码分享,展示了代码运行结果,然后分享了相关实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • pandas 根据列的值选取所有行的示例

    pandas 根据列的值选取所有行的示例

    今天小编就为大家分享一篇pandas 根据列的值选取所有行的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11

最新评论