在做深度学习实验时,需要训练和测试较多类型的数据,以此来体现网络架构的合理性。不同的数据集数量不一,且列别繁多,在做图像分类实验时,如果人工的去筛选和划分图片,工作量巨大,还容易犯错。作为一名合格的程序员,不会偷懒是万万不行的!
废话不多说,直接上代码:
#!/bin/bash
trainPath="此处写训练集的路径"
validationPath="此处写测试集的路径"
# trainPath下的所有文件夹
trainDirList=`ls $trainPath`
# 遍历存有训练集的文件夹
for DirName in $trainDirList
do
cd $trainPath/$DirName
# 当前类别文件夹下图片总数
dirNum=`ls -l|grep "^-"|wc -l`
picList=`ls *.jpg`
k=0
for fileName in $picList
do
fileNameArr[k]=$fileName
k=$k+1
done
arr=($(seq 1 $dirNum))
num=${#arr[*]}
# 需要转移到另外对应文件夹下的图片总数
let filterNum=$num*1/4
# 先随机生成一个指定范围的数字作为初始值
res=${arr[$(($RANDOM%num))]}
fileArr[1]=$res
let i=2
# 将所有生成的随机数保存进fileArr数组,作为要转移的图片的下标
while(( i<=filterNum ));
do
res=${arr[$(($RANDOM%num))]}
fileArr[i]=$res
for((j=1;j<i;j++));
do
numJ=${fileArr[j]}
if [[ $res == $numJ ]]; then
unset fileArr[i]
i=$i-1
break
fi
done
i=$i+1
done
cd $validationPath
mkdir $DirName
for((indexNum=0;indexNum<$filterNum;indexNum++))
do
# echo ${fileNameArr[fileArr[indexNum]-1]}
mv $trainPath/$DirName/${fileNameArr[fileArr[indexNum]-1]} $validationPath/$DirName
done
done
对上述代码作简要说明:首先把所有数据都放入训练集文件夹下,然后抽取四分之一的图片到测试集文件夹去,注意,中间的一大段代码实际上是为了自动生成无重复的随机数。
代码几秒钟就可以跑完,打开文件管理器查看,已经筛选完毕,省时省力,还能温习一下 shell 编程方面的知识,何乐而不为?