问题描述
我正在尝试将我的自定义数据集随机拆分为测试和训练。代码运行并成功输出 test 和 train 文件夹,但我需要每次运行代码时测试和训练集都不同。这不就是随机分裂的意思吗?
附言为了澄清起见,数据是图像,所以我希望每次执行代码时都能看到为测试和训练集选择的不同图像。
#Set the random seeds for reproducibility
SEED = 1234
random.seed(SEED)
np.random.seed(SEED)
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED)
torch.backends.cudnn.deterministic = True
TRAIN_RATIO = 0.9
data_dir = 'Data Set 1'
images_dir = os.path.join(data_dir,'images')
train_dir = os.path.join(data_dir,'train')
test_dir = os.path.join(data_dir,'test')
if os.path.exists(train_dir):
shutil.rmtree(train_dir)
if os.path.exists(test_dir):
shutil.rmtree(test_dir)
os.makedirs(train_dir)
os.makedirs(test_dir)
classes = os.listdir(images_dir)
for c in classes:
class_dir = os.path.join(images_dir,c)
images = os.listdir(class_dir)
n_train = int(len(images) * TRAIN_RATIO)
n_test = len(images) - n_train
train_images,test_images = data.random_split(images,[n_train,n_test])
os.makedirs(os.path.join(train_dir,c),exist_ok=True)
os.makedirs(os.path.join(test_dir,exist_ok=True)
for image in train_images:
image_src = os.path.join(class_dir,image)
image_dst = os.path.join(train_dir,c,image)
shutil.copyfile(image_src,image_dst)
for image in test_images:
image_src = os.path.join(class_dir,image)
image_dst = os.path.join(test_dir,image_dst)
解决方法
它不是随机的,因为您设置了随机种子。把种子想象成一个随机数——如果你定义了种子,这个数字就不再是随机的了。如果你不定义它,你每次都会得到一个随机种子。 只需注释掉这些行:)
SEED = 1234
random.seed(SEED)
np.random.seed(SEED)
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED)
或者,只需执行以下操作:SEED = random.randint(1,1000)
以获取 1 到 1000 之间的随机数。如果出于某种原因需要,这将允许您打印 SEED
的值。
你可以在这里看到种子函数是如何工作的: https://www.w3schools.com/python/ref_random_seed.asp