Python 实现数据集自动划分(训练集 / 验证集 / 测试集)

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用于文件复制:

python运行

import os import random import shutil 

2. 保证结果可复现

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

python运行

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

3. 目录设置与创建

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

python运行

# 数据集根目录 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. 读取与划分文件

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

python运行

# 获取所有.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)复制到划分后的目录:

python运行

# 复制训练集文件 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. 输出划分结果

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

python运行

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

使用说明

  1. 格式适配:若图片格式为.png 等,需修改endswith('.jpg')为对应格式;标签格式不同时同理。
  2. 比例调整:修改train_ratioval_ratiotest_ratio可自定义划分比例。

目录结构要求:原始数据集需按如下结构存放(可修改代码中data_dir路径适配你的数据):

datasets/ ├─ images/ # 存放所有图片(.jpg格式) └─ labels/ # 存放所有标签(.txt格式,与图片同名) 

Read more

Flutter for OpenHarmony:fpdart 函数式编程的终极奥义(Option/Either/Task 让代码更安全) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:fpdart 函数式编程的终极奥义(Option/Either/Task 让代码更安全) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 Dart 是一门面向对象(OOP)语言,但它也混入了很多函数式编程(FP)的特性(如一等函数、map/reduce)。 然而,在处理错误处理、空安全、副作用管理时,传统的 OOP 做法(try-catch, if-null)往往会导致代码嵌套过深,逻辑分散。 fpdart 是目前 Dart 生态中最完善的函数式编程库。它引入了 Haskell/Scala/Rust 等语言中经过实战检验的概念: * Option: 优雅处理可能为空的值(告别 null)。 * Either: 优雅处理错误(告别 try-catch)。 * Task: 优雅处理异步(即 Lazy Future)。 对于

By Ne0inhk
Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战

Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战 前言 在进行 Flutter for OpenHarmony 的去中心化应用(DApp)或加密货币钱包开发时,支持标准的 WalletConnect 协议是链接用户钱包的关键。wallet_connect 是该协议的 Dart 实现,它能让你的鸿蒙 App 安全地与 MetaMask、Trust Wallet 等钱包建立双向加密连接。本文将探讨如何在鸿蒙系统下构建安全、稳定的 Web3 授权流程。 一、原理解析 / 概念介绍 1.1 基础原理

By Ne0inhk
【Nginx】——从0到1,带你玩转Nginx,掌握其中的技巧以及配置

【Nginx】——从0到1,带你玩转Nginx,掌握其中的技巧以及配置

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL,Java基础,Rust】 🎈热门专栏:🎊【Python,Javaweb,Springboot】  感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 目录 🎈概念 🎈下载 🎈上传安装 ✨开始安装 ✨ 目录结构 🎈 常用命令  ✨ 开启nginx  ✨ 看一下文件日志  ✨ 重新加载配置文件 ✨ 配置文件  🎈 配置文件结构 🎈具体应用 ✨ 部署静态资源 ✨ 反向代理 ✨ 负载均衡 🎈概念         Nginx(engine x)由俄罗斯的程序设计师Igor Sysoev所开发,官方测试显示Nginx能够支撑高达5万并发连接数。Nginx不仅可以作为HTTP服务器使用,处理静态页面或支持FastCGI、SCGI、uWSGI等协议的动态语言,还能充当反向代理服务器,实现负载均衡,以及提供IMAP/

By Ne0inhk
【Claude Code】无需sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程

【Claude Code】无需sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程

🐧 无需 sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程 🚀 环境:Ubuntu / CentOS / Arch 等任意发行版 权限:❌ 不需要 root,❌ 不需要 sudo,✅ 只要你能登录就行! 文章目录 * 🐧 无需 sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程 🚀 * 🌈 最终效果 * 📦 1. 准备用户级目录 * 🔍 2. 一键获取“最新 20.x LTS”真实下载地址 * ⬇️ 3. 下载 + 解压(一条命令搞定) * 📁 4. 把 Node 塞进自己的 PATH * 🪣 5. 给 npm

By Ne0inhk