前言


   深度学习说到底是由数据驱动的,所以数据是非常重要的。我们在网上收集的数据,常常是没有分成训练集,验证集和测试的,需要我们自己进行分割。本笔记的代码参照了深度之眼老师提供的参考代码,并作了一些相关的拓展。

   代码和数据集:dataSplit.zip


任务


  在网上收集不同类别的数据,笔者收集了两个类别的数据,antsbees各100张,放在old_data下的两个文件夹内。拆分数据集为训练集,验证集和测试集。


数据集拆分


  拆分数据集,即要随机分配数据到训练集,验证集和测试集。可以有两种方式,第一种是直接拆分数据,即直接在物理地址上切分;第二种是分别生成训练集、验证集和测试集的路径列表文件,然后在读取过程中切分。

  • 要用到的函数简析

  os.listdir(): 获取给定路径下的文件和文件夹列表,不能得到下一级目录的文件和文件夹列表。如:

print(os.listdir(old_path))
# output
# ['ants', 'bees']

  os.walk(): 该方法有4个参数,我们就用一个就可以,即top,是要遍历的路径。该方法可以遍历完给定路径下的所有文件信息,为定路径下的每一个目录(包括自身)返回的一个三元组,即(root, dirs , files)。root指当前遍历文件夹的的地址,dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录),files 同样是 list , 内容是该文件夹中所有的文件。如:

root_dir, sub_dirs, sub_sub_dirs  = os.walk(old_path)
print(root_dir, '\n', sub_dirs, '\n', sub_dirs1)
# output
# ('old_data', ['ants', 'bees'], [])
# ('old_data\\ants', [], ['1030023514_aad5c608f9.jpg', '1095476100_3906d8afde.jpg', .....])
# ('old_data\\bees', [], ['1092977343_cb42b38d62.jpg', '1093831624_fb5fbe2308.jpg', .....]for root_dir, sub_dirs, files in os.walk(old_path):                     # 遍历os.walk()返回的每一个三元组,内容分别放在三个变量中print('root_dir:', root_dir, 'sub_dirs:', sub_dirs, 'file:', files)# output
# root_dir: old_data sub_dirs: ['ants', 'bees'] file: []
# root_dir: old_data\ants sub_dirs: [] file: ['1030023514_aad5c608f9.jpg', .....]
# root_dir: old_data\bees sub_dirs: [] file: ['1092977343_cb42b38d62.jpg', .....]

  os.path.join(): 把字符拼接成目录。
  shuffle() : 将序列的所有元素随机排序
  filter():filter(function, iterable),用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。该函数接收两个参数,第一个为判断函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。如下表示去掉img_names列表中非.jpg文件,并将结果转换成列表。

list(filter(lambda x: x.endswith('.jpg'), img_names))
  • 第一种:直接切分数据

  要用到shutil包来复制数据。思路就是遍历目录下的所有文件,得到所有类别的存放路径。遍历每个类别,然后获得每个类别的所有图片的名称列表,并将其随机排列。然后创建存放对应数据集的文件夹,并遍历图片名称列表,按照比例(8:1:1)将名字分配给不同的集。最后拼接路径,根据路径复制图片到对应位置。代码如下:

import os
import random
import math
import shutildef data_split(old_path):new_path = 'data'if os.path.exists('data') == 0:os.makedirs(new_path)for root_dir, sub_dirs, file in os.walk(old_path):                               # 遍历os.walk()返回的每一个三元组,内容分别放在三个变量中for sub_dir in sub_dirs:file_names = os.listdir(os.path.join(root_dir, sub_dir))                 # 遍历每个次级目录file_names = list(filter(lambda x: x.endswith('.jpg'), file_names))      # 去掉列表中的非jpg格式的文件random.shuffle(file_names)for i in range(len(file_names)):if i < math.floor(0.8*len(file_names)):sub_path = os.path.join(new_path, 'train_set', sub_dir)elif i < math.floor(0.9*len(file_names)):sub_path = os.path.join(new_path, 'val_set', sub_dir)elif i < len(file_names):sub_path = os.path.join(new_path, 'test_set', sub_dir)if os.path.exists(sub_path) == 0:os.makedirs(sub_path)shutil.copy(os.path.join(root_dir, sub_dir, file_names[i]), os.path.join(sub_path, file_names[i]))   # 复制图片,从源到目的地if __name__ == '__main__':data_path = 'old_data'data_split(data_path)

  结果:

  第二种:生成路径列表

  代码与上述方法类似,此方法只是将路径,分别储存到三个不同的文本文件中。这种方法可以直接生成路径列表,在加载数据时不用重新生成,使得数据读取过程简化了。代码如下:

def data_list(path):for root_dir, sub_dirs, _ in os.walk(path):                               # 遍历os.walk()返回的每一个三元组,内容分别放在三个变量中idx = 0for sub_dir in sub_dirs:file_names = os.listdir(os.path.join(root_dir, sub_dir))                 # 遍历每个次级目录file_names = list(filter(lambda x: x.endswith('.jpg'), file_names))      # 去掉列表中的非jpg格式的文件random.shuffle(file_names)for i in range(len(file_names)):if i < math.floor(0.8 * len(file_names)):txt_name = 'train_set.txt'elif i < math.floor(0.9 * len(file_names)):txt_name = 'val_set.txt'elif i < len(file_names):txt_name = 'test_set.txt'with open(os.path.join(path, txt_name), mode='a') as file:file.write(str(idx) + ',' + os.path.join(path, sub_dir, file_names[i]) + '\n')     # 为了以后好用,修改了这里,将' '改成了',',另外路径加了sub_diridx += 1if __name__ == '__main__':data_path = 'old_data'data_list(data_path)

  结果:


参考


  https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6
  https://www.runoob.com/python/os-walk.html
  https://www.runoob.com/python/os-listdir.html

深度之眼Pytorch打卡(六):将数据集切分成训练集、验证集和测试集的方法相关推荐

  1. 【小白学PyTorch】 2.浅谈训练集验证集和测试集

    文章目录: 经验误差与过拟合 评估方法 经验误差与过拟合 关键词:错误率(error rate),精度(accuracy). 错误率好理解,就是m个样本中,a个样本分类错误,则错误率E = a/m . ...

  2. 数据集切分(训练,验证,测试)

    import os import random from shutil import copy2def data_set_split(src_data_folder, target_data_fold ...

  3. 深度之眼Pytorch打卡(九):Pytorch数据预处理——预处理过程与数据标准化(transforms过程、Normalize原理、常用数据集均值标准差与数据集均值标准差计算)

    前言   前段时间因为一些事情没有时间或者心情学习,现在两个多月过去了,事情结束了,心态也调整好了,所以又来接着学习Pytorch.这篇笔记主要是关于数据预处理过程.数据集标准化与数据集均值标准差计算 ...

  4. 深度之眼Pytorch打卡(十三):Pytorch全连接神经网络部件——线性层、非线性激活层与Dropout层(即全连接层、常用激活函数与失活 )

    前言   无论是做分类还是做回归,都主要包括数据.模型.损失函数和优化器四个部分.数据部分在上一篇笔记中已经基本完结,从这篇笔记开始,将学习深度学习模型.全连接网络MLP是最简单.最好理解的神经网络, ...

  5. 吴恩达神经网络和深度学习-学习笔记-6-训练集、验证集和测试集 + 偏差bias和方差variance

    寻找最优超参数是一个迭代过程 在今天,应用深度学习是一个典型的迭代过程. 创建高质量的训练数据集.验证集和测试集,有助于提高循环效率. 训练集.验证集和测试集 数据Data分为三部分: 训练集trai ...

  6. YOLOv5将自己数据集划分为训练集、验证集和测试集

    在用自己数据集跑YOLOv5代码时候,需要将自己的VOC标签格式数据集转为yolo格式. 首先是要获取自己的数据集,然后再对数据集进行标注,保存为VOC(xml格式).然后再把标注完的数据集划分为训练 ...

  7. python 训练集 测试集 验证集划分_将自己的图片数据集分成训练集、验证集和测试集并用 Tensorflow2.0 导入...

    文章目录项目介绍 划分数据集1.在 dataset 目录下创建三个文件夹 2.将原来 dataset 文件夹中的子文件夹分别复制到这三个文件夹中 3.在 python 中指定所有路径 4.将这三个文件 ...

  8. Python将数据集划分为训练集、验证集和测试集

    将数据集(位置:D:/Code/Data/centerlinedata/tem_voc/JPEGImages/)下的621张图片按照划分比例(如 训练集(train):验证集(val):测试集(tes ...

  9. ML之FE:数据处理—特征工程之数据集划分成训练集、验证集、测试集三部分简介、代码实现、案例应用之详细攻略

    ML之FE:数据处理-特征工程之数据集划分成训练集.验证集.测试集三部分简介.代码实现.案例应用之详细攻略 目录 数据集划分成训练.验证.测试三种数据的简介 1.训练集.验证集的作用 2.验证数据集 ...

  10. 31,32,33_过拟合、欠拟合的概念、L2正则化,Pytorch过拟合欠拟合,交叉验证-Train-Val-Test划分,划分训练集和测试集,K-fold,Regularization

    1.26.过拟合.欠拟合及其解决方案 1.26.1.过拟合.欠拟合的概念 1.26.1.1.训练误差和泛化误差 1.26.1.2.验证数据集与K-fold验证 1.26.1.3.过拟合和欠拟合 1.2 ...

最新文章

  1. 全球规模最大的全浸没式液冷数据中心落户杭州余杭
  2. Ajax.NET 作者发布支持Visual Web Developer 2005的模板安装
  3. 8086处理器的无条件转移指令——《x86汇编语言:从实模式到保护模式》读书笔记13
  4. c++ vector 一部分_为什么现在的手机都采用Type-C接口?它到底好在哪里?看完你就明白了...
  5. mrunit_使用MRUnit测试Hadoop程序
  6. Python学习札记(十三) Function3 函数参数二
  7. 热门wordpress主题Essentials汉化绿色版[更至v2.0.0]
  8. Objective -C-2
  9. deepin linux下解决Qt搜狗输入法无法输入中文
  10. java混淆加密_源代码部分加密混淆方案
  11. 洛谷 1315 观光公交——贪心
  12. c++初学,计算立方体的体积和面积,并比较两个立方体是否相同:
  13. C语言打印金字塔,菱形,V形图案
  14. JAVA当前时间timestamp_java获取获得Timestamp类型的当前系统时间
  15. 定时器+echarts运行时间太长导致内存溢出页面崩溃
  16. qq不显示我的android手机,qq2013不显示手机在线怎么办
  17. 计算机论文课题来源,浅析论文题目的来源和意义
  18. BackTrack 4 R1 – Public Release
  19. 20200722-Java面经-被血虐-面试问题及总结
  20. java 读取excel表格_Java读取excel表格(原理+实现)

热门文章

  1. Cannot add foreign key constraint 错误解决办法
  2. Java设计模式:单例模式的7种实现
  3. 出售时间的网站(跟王利芬创建的优米网其中一种模式一样)
  4. [附源码]计算机毕业设计JAVA景区门票系统
  5. DRM in Android
  6. html灯箱效果代码,WordPress纯代码实现图片灯箱lightbox效果
  7. 电路交换技术与包交换技术
  8. 后盾网经典原创视频教程php,《后盾网经典原创视频教程-PHP》139集
  9. 微软ime日文输入法在假名输入模式下怎么快速输入英文
  10. 163邮箱邮件被退回,什么企业邮箱可以接收国外邮件?