文章目录

  • 程序:
  • 下面简单介绍一下程序流程
    • 1、引入库
      • os库
      • shutil
      • random
    • 2、mk_file函数
    • 3、主函数

程序:

我们在训练卷积神经网络之前,要搭建好数据集,分成训练集和测试集两部分。
本程序以花分类数据集为例,将数据集分成训练集和测试集。

先把完整的程序贴出来。

#split_data.pyimport os
from shutil import copy, rmtree
import randomdef mk_file(file_path: str):if os.path.exists(file_path):# 如果文件夹存在,则先删除原文件夹在重新创建rmtree(file_path)os.makedirs(file_path)def main():# 保证随机可复现random.seed(0)# 将数据集中10%的数据划分到验证集中split_rate = 0.1# 指向你解压后的flower_photos文件夹cwd = os.getcwd()data_root = os.path.join(cwd, "flower_data")origin_flower_path = os.path.join(data_root, "flower_photos")assert os.path.exists(origin_flower_path)flower_class = [cla for cla in os.listdir(origin_flower_path)if os.path.isdir(os.path.join(origin_flower_path, cla))]# 建立保存训练集的文件夹train_root = os.path.join(data_root, "train")mk_file(train_root)for cla in flower_class:# 建立每个类别对应的文件夹mk_file(os.path.join(train_root, cla))# 建立保存验证集的文件夹val_root = os.path.join(data_root, "val")mk_file(val_root)for cla in flower_class:# 建立每个类别对应的文件夹mk_file(os.path.join(val_root, cla))for cla in flower_class:cla_path = os.path.join(origin_flower_path, cla)images = os.listdir(cla_path)num = len(images)# 随机采样验证集的索引eval_index = random.sample(images, k=int(num*split_rate))for index, image in enumerate(images):if image in eval_index:# 将分配至验证集中的文件复制到相应目录image_path = os.path.join(cla_path, image)new_path = os.path.join(val_root, cla)copy(image_path, new_path)else:# 将分配至训练集中的文件复制到相应目录image_path = os.path.join(cla_path, image)new_path = os.path.join(train_root, cla)copy(image_path, new_path)print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing barprint()print("processing done!")if __name__ == '__main__':main()

下面简单介绍一下程序流程

1、引入库

import os
from shutil import copy, rmtree
import random

os库

os 库提供通用的、基本的操作系统交互功能。
os 库是Python标准库,包含几百个函数,常用的有路径操作、进程管理、环境参数等。
os可以实现简单的文件夹和文件操作。
可参考Python os库使用

shutil

shutil可以实现复杂的文件操作,比如对文件的拷贝和复制。

random

很常用的关于随机生成的库。

2、mk_file函数

def mk_file(file_path: str):if os.path.exists(file_path):# 如果文件夹存在,则先删除原文件夹在重新创建rmtree(file_path)os.makedirs(file_path)

os.path.exists(path) :判断path对应文件或目录是否存在,返回True或False

rmtree() :递归地删除文件夹下的所有子文件夹和子文件。

os.makedirs():可以创建多级目录,如果路径的目录都不存在,都可以创建出来。


所以这个mk_file函数的作用是,当目标文件已经存在,删除后再创建。即覆盖更新过程。

3、主函数

  • 1
def main():# 保证随机可复现random.seed(0)# 将数据集中30%的数据划分到验证集中split_rate = 0.3

random.seed():创建随机种子,括号里添加具体数值方便让后续的随机生成操作可复现。

  • 2
    # 指向你解压后的flower_photos文件夹cwd = os.getcwd()data_root = os.path.join(cwd, "flower_data")origin_flower_path = os.path.join(data_root, "flower_photos")assert os.path.exists(origin_flower_path)  #确定这个路径是存在的flower_class = [cla for cla in os.listdir(origin_flower_path)if os.path.isdir(os.path.join(origin_flower_path, cla))]  #建立一个花的类别的列表

os.getcwd():返回程序的当前路径。


这里我放置这个split_data.py程序的路径为 E:\1test\date_test


os.path.join(path1,path2): 路径拼接


所以data_root 得到路径E:\1test\date_test\flower_data
origin_flower_path得到路径E:\1test\date_test\flower_data\flower_photos



说明一下,我们存放有花数据的文件夹flower_data,与这个程序在同一级文件夹下。

flower_data文件夹里有我们下载好(或自己爬好)的未划分的数据


data_root = os.path.join(cwd, “flower_data”)定位了flower_data文件夹的路径。
origin_flower_path = os.path.join(data_root, “flower_photos”)定位了下一级文件夹里flower_photos的路径。


os.listdir():用于返回一个由文件名和目录名组成的列表,需要注意的是它接收的参数需要是一个绝对的路径。
如:
已知路径path = /home/python/Desktop/
请输出该路径下的所有文件和目录名称

import os
path = '/home/python/Desktop/'
for i in os.listdir(path):print(i)

os.path.isdir():用于判断对象是否为一个目录
如:
已知路径path = /home/python/Desktop/
请输出该目录下包含的目录名称

import os
for i in os.listdir(path):if os.path.isdir(i):print(i)

flower_class = [cla for cla in os.listdir(origin_flower_path)if os.path.isdir(os.path.join(origin_flower_path, cla))]

这句代码,把origin_flower_path 下的花的类别文件夹名,生成了一个花类列表[“daisy”,“dandelion”,“roses”,“sunflowers”,“tulips”]


  • 3
    # 建立保存训练集的文件夹train_root = os.path.join(data_root, "train")mk_file(train_root)for cla in flower_class:# 建立每个类别对应的文件夹mk_file(os.path.join(train_root, cla))# 建立保存验证集的文件夹val_root = os.path.join(data_root, "val")mk_file(val_root)for cla in flower_class:# 建立每个类别对应的文件夹mk_file(os.path.join(val_root, cla))

解释:


train_root = os.path.join(data_root, "train")
mk_file(train_root)#在data_root路径下(flower_data文件夹)创建train文件夹

    for cla in flower_class:mk_file(os.path.join(train_root, cla))
# 在建立好的train文件夹下,建立每个类别对应的文件夹

验证集同理。
注意这一步形成了空的、分别用来保存训练集和测试集的文件夹,需要下一步填入图片。


  • 4
    for cla in flower_class:cla_path = os.path.join(origin_flower_path, cla)images = os.listdir(cla_path)num = len(images)# 随机采样验证集的索引eval_index = random.sample(images, k=int(num*split_rate))for index, image in enumerate(images):if image in eval_index:# 将分配至验证集中的文件复制到相应目录image_path = os.path.join(cla_path, image)new_path = os.path.join(val_root, cla)copy(image_path, new_path)else:# 将分配至训练集中的文件复制到相应目录image_path = os.path.join(cla_path, image)new_path = os.path.join(train_root, cla)copy(image_path, new_path)print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing barprint()

解释:


     cla_path = os.path.join(origin_flower_path, cla)#定位到原始数据集的各类花的文件夹(含有一类花的所有图片)

        images = os.listdir(cla_path)
#将这类花文件夹下的所有图片形成一个列表。

        num = len(images)# 随机采样验证集的索引eval_index = random.sample(images, k=int(num*split_rate))

k=int(num*split_rate)即要挑选出的验证集图片数。
这一步用随机方法形成了要放进验证集里的图片的索引的一个列表。


        for index, image in enumerate(images):if image in eval_index:# 将分配至验证集中的文件复制到相应目录image_path = os.path.join(cla_path, image)new_path = os.path.join(val_root, cla)copy(image_path, new_path)

enumerate函数可以同时获得索引和值。
所以这句代码的意思 ,我从原来一个花类(如daisy)的所有图片中判断,如果这个图片的索引是上一步要取出作为验证集的,那就把它copy到之前建好的放验证集的空的同名文件夹下(如val\daisy).


            else:# 将分配至训练集中的文件复制到相应目录image_path = os.path.join(cla_path, image)new_path = os.path.join(train_root, cla)copy(image_path, new_path)

紧接着,如果不是要作为验证集的图片,把他copy到之前建好的放训练集的空的同名文件夹下(如train\daisy).


            print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing bar

实时显示进度。


以上就是这个将数据集分割为训练集和验证集的思路。

以后自己通过爬取图片建立数据集,按照这个程序思路,就不用自己一点一点算数量,进行复制粘贴的麻烦工作了。直接使用这个程序,更改一下文件夹名称,直接用就可以了。不过要注意层级结构,这个脚本和放数据的文件是同级的,可以参考上面的截图

希望能对你有所帮助!o( =•ω•= )m

将数据集分为训练集和测试集(python脚本)相关推荐

  1. python划分数据集用pandas_用pandas划分数据集实现训练集和测试集

    1.使用model_select子模块中的train_test_split函数进行划分 数据:使用kaggle上Titanic数据集 划分方法:随机划分 # 导入pandas模块,sklearn中mo ...

  2. 【自存代码】划分数据集为训练集和测试集

    [自存代码]划分image和label为训练集和测试集 修改自这位大佬的代码:https://blog.csdn.net/weixin_47414034/article/details/1254793 ...

  3. python创建数据集_利用 python 在本地数据集创建训练集和测试集

    根据自己的数据集,自动划分训练集.测试集 举个栗子: 已经分好的文件: origin 文件夹有三类数据:good,bad,m,每类文件夹包含不同数量的图片,如下: 需要生成数据集的文件: 结果:根据设 ...

  4. Python分割训练集和测试集

    数据集介绍 使用数据集Wine,来自UCI.包括178条样本,13个特征. import pandas as pd import numpy as npdf_wine = pd.read_csv('h ...

  5. 5.sklearn之转换器(划分训练集和测试集、以及标准化、归一化数据会用transform,独热编码也会用到)

    文章目录 1. 什么是转换器? 2. 测试集和训练集 2.1 训练集 .测试集.验证集 2.2 拆分训练集测试集有个问题 2.3 代码 3. 标准化 3.1 上离差标准化代码(举一反三就好了,其他几个 ...

  6. fgvc-aircraft-2013b飞机细粒度数据训练集和测试集划分python代码

    fgvc-aircraft-2013b是细粒度图像分类和识别研究中经典的benchmarks,它包含四种类型的标注: (1)按照manufacturer进行划分,可分为30个类别,例如ATR.Airb ...

  7. python机器学习 train_test_split()函数用法解析及示例 划分训练集和测试集 以鸢尾数据为例 入门级讲解

    文章目录 train_test_split()用法 获取数据 划分训练集和测试集 完整代码脚手架 train_test_split()用法 python机器学习中常用 train_test_split ...

  8. python尝试不同的随机数进行数据划分、使用卡方检验依次计算不同随机数划分下训练接和测试集所有分类特征的卡方检验的p值,如果所有p值都大于0.05则训练集和测试集都具有统计显著性、数据划分合理

    python尝试不同的随机数进行数据划分.使用卡方检验依次计算不同随机数划分下训练接和测试集所有分类特征(categorical)的卡方检验的p值,如果所有p值都大于0.05则退出循环.则训练集和测试 ...

  9. iris数据集_sklearn日志(二)训练集和测试集划分

    机器学习算法需要大量的数据,这些数据一部分用于模型训练,另一部分作为测试或验证. 机器学习入坑者:sklearn日志(一)体验官方提供的标准数据集​zhuanlan.zhihu.com sklearn ...

最新文章

  1. win10+centos7+Anaconda3+python+pytorch
  2. 【深度学习】迁移学习理论与实践
  3. mysql jdbc链接配置文件_Java JDBC使用配置文件连接数据库
  4. 网络编程之 osi七层协议
  5. 写有效率的SQL查询(I)
  6. AJAX实例二:实现类似Google的搜索提示【原著】
  7. ASP.NET读取自定义的config文件
  8. [Tizen开发]SDB调试工具使用简介
  9. .Net操作Office总结一 - 使用VS2010自带的Office模板进行开发
  10. solidworks有限元分析_新手学习心得体会
  11. 技能 | 制作excel版学生成绩分析表
  12. SageMath | Crypto Tool
  13. 计算机的发明人是约翰用英语,电脑发明者是谁:约翰·冯·诺依曼(发明于1946年)...
  14. 报错:The JSP specification requires that an attribute name is preceded by whitespace
  15. health_parent的linux环境
  16. 关于文件上传失败的问题
  17. 不错的软件测试学习网站
  18. 小红书KOL营销策略,先搞清楚小红书kol分类有哪些
  19. 互联网行业的一些职位缩写
  20. 蛋白质相互作用系列:GN算法

热门文章

  1. 【Arduino学习】06.L293D驱动5V直流电机
  2. 单例模式:创建独一无二的对象
  3. 青岛二中2019男人8题初步题解
  4. unryu 落魄@王子
  5. java毕业设计宠物医院后台管理系统设计与实现Mybatis+系统+数据库+调试部署
  6. XXX收集了三年的最好的设计网站
  7. js 时间截取年月日
  8. 为什么别人不愿意回答你问的问题
  9. C#练习题答案: 简单有趣#21:向数氏族【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  10. Python筛选txt中特定内容