如何将Colab中的图像文件夹按比例拆分为训练/验证/测试集?
数据集拆分解决方案
splitfolders代码不生效的原因及修正
执行无输出问题核心是路径配置错误,Colab的根目录前缀为/,你的输入路径漏写了开头的斜杠,导致库找不到对应数据源。
splitfolders默认生成的三个子文件夹命名规则为train、val、test,直接生成在你指定的output路径下。
修正后的可运行代码如下:
# 未安装依赖先执行安装 !pip install split-folders import splitfolders # 路径开头加/指向Colab根目录,output用绝对路径更方便查找生成的文件 splitfolders.ratio("/content/data", output="/content/output", seed=1337, ratio=(.8, .1, .1), group_prefix=None)
执行完成后直接访问/content/output路径,即可看到三个拆分后的文件夹。
PyTorch原生实现方案
不需要依赖第三方拆分库,自定义程度更高,完整可运行代码如下:
import os import torch import random import shutil from torch.utils.data import random_split from torchvision.datasets import ImageFolder # 基础参数配置 DATASET_PATH = "/content/data" # 原始图像存放路径 OUTPUT_PATH = "/content/split_dataset" TRAIN_RATIO = 0.8 VAL_RATIO = 0.1 TEST_RATIO = 0.1 SEED = 1337 # 读取原始数据集(要求原始数据按类别存放在子文件夹中,适配ImageFolder格式) dataset = ImageFolder(DATASET_PATH) # 按比例计算各拆分集样本量 total_len = len(dataset) train_len = int(total_len * TRAIN_RATIO) val_len = int(total_len * VAL_RATIO) test_len = total_len - train_len - val_len # 拆分数据集,固定种子保证可复现 train_dataset, val_dataset, test_dataset = random_split( dataset, [train_len, val_len, test_len], generator=torch.Generator().manual_seed(SEED) ) # 拆分文件写入函数 def save_split_files(split_name, split_dataset): # 创建拆分集根目录、对应类别子目录 split_root = os.path.join(OUTPUT_PATH, split_name) os.makedirs(split_root, exist_ok=True) for class_name in split_dataset.dataset.classes: os.makedirs(os.path.join(split_root, class_name), exist_ok=True) # 复制图像到对应路径 for idx in split_dataset.indices: img_path, class_idx = split_dataset.dataset.samples[idx] class_name = split_dataset.dataset.classes[class_idx] target_path = os.path.join(split_root, class_name, os.path.basename(img_path)) shutil.copy(img_path, target_path) # 执行全量拆分写入 save_split_files("train", train_dataset) save_split_files("val", val_dataset) save_split_files("test", test_dataset)
执行后所有拆分后的文件都会存放在/content/split_dataset路径下,保持和原始数据集一致的类别子目录结构,可直接被ImageFolder加载用于后续训练。
内容的提问来源于stack exchange,提问作者french_fries
相关产品推荐
相关产品推荐

