Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为嵌套在多个文件夹中的数据创建序列、测试拆分_Python_Machine Learning_Pytorch - Fatal编程技术网

Python 为嵌套在多个文件夹中的数据创建序列、测试拆分

Python 为嵌套在多个文件夹中的数据创建序列、测试拆分,python,machine-learning,pytorch,Python,Machine Learning,Pytorch,我正在为训练图像识别模型准备数据。我目前有一个文件夹(数据集),其中包含多个带有标签名称的文件夹,这些文件夹中包含图像 我想以某种方式分割此数据集,以便我有两个主文件夹,其中包含相同的子文件夹,但这些文件夹中的图像数量应根据首选的列车/测试分割,例如,列车数据集中90%的图像和测试数据集中10%的图像 我正在努力寻找分割数据的最佳方法。我读到一个建议,pytorch torch.utils.Dataset类可能是一种方法,但我似乎无法让它保持文件夹层次结构。如果您有这样的文件夹结构: folde

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

我想以某种方式分割此数据集,以便我有两个主文件夹,其中包含相同的子文件夹,但这些文件夹中的图像数量应根据首选的列车/测试分割,例如,列车数据集中90%的图像和测试数据集中10%的图像


我正在努力寻找分割数据的最佳方法。我读到一个建议,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我认为不会有问题。在这个答案中也是以同样的方式进行的: