【问题标题】:Creating a train, test split for data nested in multiple folders为嵌套在多个文件夹中的数据创建训练、测试拆分
【发布时间】:2020-11-09 19:27:34
【问题描述】:

我正在准备用于训练图像识别模型的数据。我目前有一个文件夹(数据集),其中包含多个带有标签名称的文件夹,这些文件夹中包含图像。

我想以某种方式拆分此数据集,以便我有两个具有相同子文件夹的主文件夹,但这些文件夹中的图像数量要根据首选的训练/测试拆分,例如 90% 的图像训练数据集和测试数据集中的 10%。

我正在努力寻找拆分数据的最佳方法。我已经阅读了一个建议,即 pytorch torch.utils.Dataset 类可能是一种方法,但我似乎无法让它发挥作用来保留文件夹层次结构。

【问题讨论】:

    标签: python machine-learning pytorch


    【解决方案1】:

    如果你有这样的文件夹结构:

    folder
    │     
    │
    └───class1
    │   │   file011
    │   │   file012
    │   
    └───class2
        │   file021
        │   file022
    

    你可以简单地使用torchvision.datasets.ImageFolder这个类

    pytorch网站所述

    图像以这种方式排列的通用数据加载器:

    root/dog/xxx.png
    root/dog/xxy.png
    root/dog/xxz.png
    
    root/cat/123.png
    root/cat/nsdf3.png
    root/cat/asd932_.png
    

    然后,在您创建 ImageFolder 实例之后,例如这样

    dataset = torchvision.datasets.Imagefolder(YOUR_PATH, ...)
    

    你可以这样拆分:

    test_size = 0.1 * len(dataset)
    test_set = torch.utils.data.Subset(dataset, range(test_size))  # take 10% for test
    train_set = torch.utils.data.Subset(dataset, range(test_size, len(dataset)) # the last part for train
    

    如果您想对拆分进行洗牌,请记住类子集使用拆分的索引。所以你可以洗牌,然后拆分它们。做这样的事情

    indexes = shuffle(range(len(dataset)))
    indexes_train = indexes[:int(len(dataset)*0.9)]
    indexes_test = = indexes[int(len(dataset)*0.9):]
    

    【讨论】:

    • 谢谢。您知道此类是否具有每次随机拆分数据的功能吗?这种方法可能会在多个培训课程中引入偏见。
    • 我想知道这种方法是否不会导致一些问题,因为我的初始数据集的类型是 torchvision.datasets.folder.ImageFolder ,但是子集是 torch.utils。数据.数据集.子集。我仍然可以在子集上应用转换,然后将其直接馈送到 NN 吗?
    • @smejak 我认为不会有问题。在这个答案中也以同样的方式完成:stackoverflow.com/questions/57246630/…
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多