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

【笔记】在 Windows 上安装 Python-vLLM

【笔记】在 Windows 上安装 Python-vLLM

SystemPanic/vllm-windows:用于 LLM(Windows 构建和内核)的高吞吐量和内存效率推理和服务引擎 在 Windows 上安装 vLLM 有两种方式,分别是通过已发布的 wheel 包安装和从源码构建安装,具体步骤如下: 一、通过现有发布的 wheel 包安装(推荐) 发布 v0.11.0 ·SystemPanic/vllm-windows vllm-0.11.0+cu124-cp312-cp312-win_amd64.whl 1. 确认版本兼容性 确保你的 Python、PyTorch 和 CUDA 版本与 wheel 包要求一致(版本信息会在发布版本中注明)。 2. 下载 wheel 包 从 最新发布页面

By Ne0inhk
从 0 到 1:用 Python + AI 搭建一个“自动写日报”的工具(源码开放)

从 0 到 1:用 Python + AI 搭建一个“自动写日报”的工具(源码开放)

0. 序章:为了不想写日报,我写了个代码 如果是程序员最讨厌的事情排行榜,“写日报/周报”绝对能进前三。 每天晚上 6 点,当你刚刚解决完一个复杂的并发 Bug,大脑还在回味代码的优雅时,钉钉/飞书弹出一个提醒:“请提交今日日报”。 瞬间,你的大脑一片空白。 “我今天干啥了?” “上午好像在修环境?” “下午那个 Bug 到底改了哪里?” 最后,你只能打开 Git Log,一行行复制粘贴,凑出一篇流水账。 这是对生命极大的浪费。 作为一名极客,我们的原则是:凡是超过三次的重复劳动,都应该自动化。 今天,我将带你从零开始,用 Python + Git Log + LLM (大模型) 搭建一个**“全自动日报生成器”**。它不仅能自动读取你的代码提交记录,还能利用 AI 的润色能力,把破碎的提交信息通过“

By Ne0inhk
Python从0到100(九十七):VisionTransformer(ViT)在时间序列行为识别中的应用

Python从0到100(九十七):VisionTransformer(ViT)在时间序列行为识别中的应用

前言:零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者! 【优惠信息】 • 新专栏订阅前500名享9.9元优惠 • 订阅量破500后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受: - 所有问题解答 -专属福利领取 欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程! 本文目录: * 一、VisionTransformer的基础原理 * 1. 传统卷积的瓶颈与挑战 * 2. VisionTransformer的核心机制 * 3. VisionTransformer的技术优势 * 二、VisionTransformer架构设计 * 1. 架构总览 * 2. 核心模块 * 2.1 Patch嵌入层 * 2

By Ne0inhk

Python 包管理新范式:极速工具 uv 全面解析与实战指南

告别缓慢的依赖安装与混乱的虚拟环境,Python开发的效率革命已悄然到来。 在 Python 开发中,你是否曾为 pip install 漫长的等待而焦虑?是否因虚拟环境配置不一致而头疼?是否在 pip、pipx、poetry 等多个工具间切换而感到困惑? 一个名为 uv 的新星正以其惊人的速度和简洁的设计改变着这一现状。它不仅仅是又一个包管理器,更是由 Astral 团队(Ruff、Black 的创造者)打造的 Python 工具链一体化解决方案。 1. 核心功能与设计哲学 uv 是一款用 Rust 编写的极速 Python 包管理器和工具链。它旨在用一个统一的工具,替代或增强 pip、pipx、virtualenv、pip-tools、poetry 等传统工具链中的多个组件。 它的核心设计目标可概括为三个词:极速、可靠、一体。 * 极速:得益于

By Ne0inhk