zoukankan      html  css  js  c++  java
  • Little_by_Little_3 对数据进行测试集训练集验证集进行划分

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

    目的

    image-20200417103100973

    划分成image-20200417103126898

    训练集占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所在的文件路径

    image-20200417103750439

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

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

    #2 分析

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

    • 里面进行循环接收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里面的文件夹里面的文件进行循环image-20200417104550811

    • 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) 复制操作

  • 相关阅读:
    CCF计算机职业资格认证考试 201809-2 买菜
    【CodeVS3013】单词背诵
    【CodeVS3304】水果姐逛水果街Ⅰ
    【CodeVS4246】奶牛的身高
    【hdu1247】Hat’s Words
    【CodeVS4189】字典
    【CodeVS4244】平衡树练习
    【poj3264】Balanced Lineup
    【树状数组】
    【CodeVS1163】访问艺术馆
  • 原文地址:https://www.cnblogs.com/negu/p/12718466.html
Copyright © 2011-2022 走看看