现假设我们得到了一批已经分好类的数据,但是这些数据却没有做划分,即没有分为:training set/dev set/test set,现在,我们将得到的数据做training和dev的划分。现假设我们对于training和dev的划分为3:1,则:
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 15 22:37:28 2018
@author: Daniel
"""
import random
import os
import shutil
img_root = "F:/GitHub/caffe_sub/caffe/models/my_caffe_resnet_test/"
test_path = img_root + 'test/'
for root, dirs, files in os.walk(img_root + 'train2/'):
for dir in dirs:
path = os.path.join(test_path, str(dir))#准备当前正在遍历的文件夹对应于test下的文件夹
folder = os.path.exists(path)
if not folder:
os.makedirs(path)
#print("makedirs#:" + str(path))
else:
print("this folder exists!")
for root, dirs, files in os.walk(img_root+'train2/'+str(dir)):
#确定比例:验证集与训练集的比例
dev_sets = int(0.25*len(files))
print('dev_sets#:' + str(dev_sets))
for i in range(dev_sets):
#从files中随机选择一个file
random_file = random.choice(files)
#获得该文件的路径
src = os.path.join(img_root+'train2/' + str(dir) + '/'+ random_file)
#将该文件放到path中
shutil.move(src, path)
#删除src中的该文件
src_file = src#os.path.join(src, random_file)
#修改文件权限
# os.chmod(src_file, stat.S_IWRITE)#由于此处文件移动到的对应的文件,故不用删除了
#删除该文件
#os.remove(src_file)
#不仅要删除文件中的选中文件,还要删除files中列表中的该文件
print('files#: ' + str(files))
files.remove(random_file)#移动后将其从files列表中删除
print('files#: ' + str(files))
以上的代码将train中的数据随机选择了一部分移动到了test中的相对应的文件中,实现了数据的3:1划分。