这个代码主要解决的是构建5折交叉验证数据集,使之更自动,保护眼睛,保护脑细胞,自用为主。
1.需求
我现在有一个文件夹5折交叉验证数据集
,太长了简称为a
好了。。。里面有5个文件夹,image0
,image1
…每个文件夹下有8个类别 class1
,class2
,class3
…需要把类别中的文件都复制到一个目标文件夹b
,这个文件夹是这样的,有5个子文件夹,命名为0
,1
,2
,3
,4
,(就是第几折),每个文件夹下又分成2个子文件夹train
,test
,每个train文件夹下有8个类,就是a
那边的8个类,
a和b的关系就是:
0
的测试集(即test
)就是image0
,0
的训练集(即train
)就是image1
,image2
,image3
,image4
;
1
的测试集(即test
)就是image1
,1
的训练集(即train
)就是image0
,image2
,image3
,image4
;
2
的测试集(即test
)就是image2
,2
的训练集(即train
)就是image0
,image1
,image3
,image4
;
3
的测试集(即test
)就是image3
,3
的训练集(即train
)就是image0
,image1
,image2
,image4
;
4
的测试集(即test
)就是image4
,4
的训练集(即train
)就是image0
,image1
,image2
,image3
;
因为怕错,所以用手动的方法,结果当时花了40分钟,就是手动把每个类的东西全选然后复制1次,粘贴5次到不同的地方,我分神了,反正一共粘贴了200次。。。,于是搞好了很久之后,决定搞个代码,万一下次数据集更大怎么办,还是让电脑来吧
2.思路
2.1 复制的基础功能
先搞定简单的复制,参考这篇博客https://blog.csdn.net/YeziTong/article/details/84942629
sourcePath = '.\Square_train';
targetPath = '.\Square_test';
fileList = dir(sourcePath);
for k = 3 :5: length(fileList)
movefile([sourcePath,'\',fileList(k).name],targetPath);
end
%copyfile([sourcePath,'\',fileList(k).name],targetPath)
我用到的是原博主注释掉的copyfile,(复制功能),for循环对我意义不大,因为实现的功能不一样,感谢博主染血白衣
2.2遍历源文件夹
然后实现对原始文件下a的文件遍历,受第一步的启发,其实就是不断地取出对应路径,再拼接起来,主要注意for循环的起点,对于如果读出来的内容是文件夹的话,从3开始,如果读出的内容全是文件的话,从1开始。
2.3 新建目的文件夹
构建新的文件夹b,(全空,没有文件),主要使用mkdir函数,class1,class2的名字我在2.遍历源文件夹a的时候自动获取了,感觉这样会比较方便,当然可能并不。。。
2.4 每个文件复制5次
把文件一个一个复制到文件夹b的对应位置中,其实就是再次遍历原始文件夹a,然后对里面的每个文件进行5次复制,根据它的具体情况,把它复制到不同的地方。
2.5 要多用fprintf来检查是不是有问题!
3.代码
% 用于复制文件夹下的文件,人力复制粘贴可能总的要花1小时
% demo里面的代码是有个遍历源文件夹的过程,demo1的代码没有遍历源文件夹的过程
tic
clc
clear all
sourcePath_root = 'G:\数据集\5折交叉验证数据集'; %数据可用
targetPath_root = 'G:\数据集\无需人为复制粘贴5折交叉验证数据集';
count=