Little_by_Little_3 对数据进行测试集训练集验证集进行划分

时间:2020-04-17
本文章向大家介绍Little_by_Little_3 对数据进行测试集训练集验证集进行划分,主要包括Little_by_Little_3 对数据进行测试集训练集验证集进行划分使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Little_by_Little_3 对数据进行测试集训练集验证集进行划分

目的

划分成

训练集占8成,valid和test各占一成.

源代码

import os
import random
import shutil


def makedir(new_dir):#创建新文件,若没有就不创建
    if not os.path.exists(new_dir):
        os.makedirs(new_dir)


if __name__ == '__main__':

    random.seed(1)
#1
    dataset_dir = os.path.join("..", "..", "data", "RMB_data")
    split_dir = os.path.join("..", "..", "data", "rmb_split")
    train_dir = os.path.join(split_dir, "train")
    valid_dir = os.path.join(split_dir, "valid")
    test_dir = os.path.join(split_dir, "test")

    train_pct = 0.8
    valid_pct = 0.1
    test_pct = 0.1#此条无用
#2
    for root, dirs, files in os.walk(dataset_dir):#files无用
        '''
        def walk(top: T,
         topdown: bool = True,
         onerror: Optional[(Exception) -> None] = None,
         followlinks: bool = False) -> Iterator[Tuple[T, List[T], List[T]]]
         top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。

            root 所指的是当前正在遍历的这个文件夹的本身的地址
            dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
            files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
            topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。

            onerror -- 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。

            followlinks -- 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。
        '''
#3
        for sub_dir in dirs:

            imgs = os.listdir(os.path.join(root, sub_dir))#所指的是当前正在遍历的这个文件夹的本身的地址+子目录的地址
            imgs = list(filter(lambda x: x.endswith('.jpg'), imgs))#提取出文件中end为jpg的文件名且把他变成list
            random.shuffle(imgs)#打乱图片
            img_count = len(imgs)#图片个数

            train_point = int(img_count * train_pct)#训练集数
            valid_point = int(img_count * (train_pct + valid_pct))#训练集数+测试集数
#4
            for i in range(img_count):
                if i < train_point:
                    out_dir = os.path.join(train_dir, sub_dir)#
                elif i < valid_point:#取够训练集就取验证集
                    out_dir = os.path.join(valid_dir, sub_dir)
                else:
                    out_dir = os.path.join(test_dir, sub_dir)

                makedir(out_dir)

                target_path = os.path.join(out_dir, imgs[i])#拼接outdir和img名,目标文件的路径
                src_path = os.path.join(dataset_dir, sub_dir, imgs[i])#抓取文件的路径

                shutil.copy(src_path, target_path)#复制操作

            print('Class:{}, train:{}, valid:{}, test:{}'.format(sub_dir, train_point, valid_point-train_point,
                                                                 img_count-valid_point))

#1分析

    dataset_dir = os.path.join("..", "..", "data", "RMB_data")
    split_dir = os.path.join("..", "..", "data", "rmb_split")
    train_dir = os.path.join(split_dir, "train")
    valid_dir = os.path.join(split_dir, "valid")
    test_dir = os.path.join(split_dir, "test")

    train_pct = 0.8
    valid_pct = 0.1
    test_pct = 0.1#此条无用
  • dataset_dir = os.path.join("..", "..", "data", "RMB_data") 此条的作用是提取data所在的文件路径

数据路径图如上图所示,要往上两层才能导_06_rmb_classification(主文件夹)所以要加两个'..'.

  • train_pct = 0.8 划分训练集所占比例

#2 分析

for root, dirs, files in os.walk(dataset_dir):#files无用

  • 里面进行循环接收root(RMB_data本文件的路径),dirs(1文件夹和2文件夹的文件夹名)

#3 分析

        for sub_dir in dirs:

            imgs = os.listdir(os.path.join(root, sub_dir))#所指的是当前正在遍历的这个文件夹的本身的地址+子目录的地址
            imgs = list(filter(lambda x: x.endswith('.jpg'), imgs))#提取出文件中end为jpg的文件名且把他变成list
            random.shuffle(imgs)#打乱图片
            img_count = len(imgs)#图片个数

            train_point = int(img_count * train_pct)#训练集数
            valid_point = int(img_count * (train_pct + valid_pct))#训练集数+测试集数
  • 对rmb_data里面的文件夹里面的文件进行循环

  • imgs = os.listdir(os.path.join(root, sub_dir))提取出当前正在遍历的这个文件夹的本身的地址+子目录的地址,并把地址里面的文件变成list.

  • imgs = list(filter(lambda x: x.endswith('.jpg'), imgs)) 把地址里面以.jpg的文件的文件名提取出来.

#4 分析

#4
            for i in range(img_count):
                if i < train_point:
                    out_dir = os.path.join(train_dir, sub_dir)#
                elif i < valid_point:#取够训练集就取验证集
                    out_dir = os.path.join(valid_dir, sub_dir)
                else:
                    out_dir = os.path.join(test_dir, sub_dir)

                makedir(out_dir)

                target_path = os.path.join(out_dir, imgs[i])#拼接outdir和img名,目标文件的路径
                src_path = os.path.join(dataset_dir, sub_dir, imgs[i])#抓取文件的路径

                shutil.copy(src_path, target_path)#复制操作

            print('Class:{}, train:{}, valid:{}, test:{}'.format(sub_dir, train_point, valid_point-train_point,
                                                                 img_count-valid_point))

  • for i in range(img_count): 循环次数定位1或100文件里面的文件数

  •     if i < train_point:
                        out_dir = os.path.join(train_dir, sub_dir)#
                    elif i < valid_point:#取够训练集就取验证集
                        out_dir = os.path.join(valid_dir, sub_dir)
                    else:
                        out_dir = os.path.join(test_dir, sub_dir)
    
    

    控制训练集,测试集和验证集的数量.通过设置输出文件的路径来控制

  • src_path = os.path.join(dataset_dir, sub_dir, imgs[i]) 设置抓取文件的路径

  • shutil.copy(src_path, target_path) 复制操作

原文地址:https://www.cnblogs.com/negu/p/12718466.html