Python 为嵌套在多个文件夹中的数据创建序列、测试拆分
我正在为训练图像识别模型准备数据。我目前有一个文件夹(数据集),其中包含多个带有标签名称的文件夹,这些文件夹中包含图像 我想以某种方式分割此数据集,以便我有两个主文件夹,其中包含相同的子文件夹,但这些文件夹中的图像数量应根据首选的列车/测试分割,例如,列车数据集中90%的图像和测试数据集中10%的图像Python 为嵌套在多个文件夹中的数据创建序列、测试拆分,python,machine-learning,pytorch,Python,Machine Learning,Pytorch,我正在为训练图像识别模型准备数据。我目前有一个文件夹(数据集),其中包含多个带有标签名称的文件夹,这些文件夹中包含图像 我想以某种方式分割此数据集,以便我有两个主文件夹,其中包含相同的子文件夹,但这些文件夹中的图像数量应根据首选的列车/测试分割,例如,列车数据集中90%的图像和测试数据集中10%的图像 我正在努力寻找分割数据的最佳方法。我读到一个建议,pytorch torch.utils.Dataset类可能是一种方法,但我似乎无法让它保持文件夹层次结构。如果您有这样的文件夹结构: folde
我正在努力寻找分割数据的最佳方法。我读到一个建议,pytorch torch.utils.Dataset类可能是一种方法,但我似乎无法让它保持文件夹层次结构。如果您有这样的文件夹结构:
folder
│
│
└───class1
│ │ file011
│ │ file012
│
└───class2
│ file021
│ file022
您可以简单地使用类torchvision.datasets.ImageFolder
如以下网站所述:
一种通用数据加载器,其中图像按以下方式排列:
root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png
root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png
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
然后,在创建ImageFolder实例之后,例如
dataset = torchvision.datasets.Imagefolder(YOUR_PATH, ...)
您可以通过以下方式将其拆分:
root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png
root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png
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):]
如果您有如下文件夹结构:
folder
│
│
└───class1
│ │ file011
│ │ file012
│
└───class2
│ file021
│ file022
您可以简单地使用类torchvision.datasets.ImageFolder
如以下网站所述:
一种通用数据加载器,其中图像按以下方式排列:
root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png
root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png
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
然后,在创建ImageFolder实例之后,例如
dataset = torchvision.datasets.Imagefolder(YOUR_PATH, ...)
您可以通过以下方式将其拆分:
root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png
root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png
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.data.dataset.subset。我仍然可以对子集应用变换,然后直接将其提供给NN吗?@smejak我认为不会有问题。答案也是一样的:谢谢。您知道这个类是否具有每次随机分割数据的功能吗?这种方法可能会在多个培训课程中引入偏差。我不知道这种方法是否会导致一些问题,因为我的初始数据集类型是torchvision.datasets.folder.ImageFolder,但子集是torch.utils.data.dataset.subset。我仍然可以对子集应用变换,然后直接将其提供给NN吗?@smejak我认为不会有问题。在这个答案中也是以同样的方式进行的: