我有一个包含两个子目录的目录。每个子目录都有一堆图像。这些子目录还指定了两类图像。
我想要 3 个目录(训练、验证、测试),并且在这 3 个子目录中的每一个中,我想要每个类的 2 个子目录分别带有图像。
我想通过随机抽样将 no.of 图像分成 train、val、test 目录。所以大约 60% 的图像用于训练,20、val 和 20 用于测试。
初始结构:
Main_folder
- Good
- Bad
Run Code Online (Sandbox Code Playgroud)
我想要的是:
Main_folder:
- Train
- Good
- Bad
- Val
- Good
- Bad
- Test
- Good
- Bad
Run Code Online (Sandbox Code Playgroud)
我想将每个子目录分成两个目录,随机分配图像(
有一种pytorch方法可以做到这一点(我建议使用单个库来完成如此简单的任务)。
里面有一个预制的torchvision,即ImageFolder.
只需像这样使用它:
import torchvision
dataset = torchvision.datasets.ImageFolder("./my_data")
Run Code Online (Sandbox Code Playgroud)
这将创建一个数据集,其中Good文件夹分别具有0标签和这些文件夹中每个图像的Bad标签1。
不需要sklearn这么简单的工作 +torch也有大部分numpy功能,我宁愿坚持使用一个库而不是 3 个(尽管train_test_split可以连续使用两次,类似于@ESZ提出的)。
国际海事组织更简单的是:
def get_subset(indices, start, end):
return indices[start : start + end]
TRAIN_PCT, VALIDATION_PCT = 0.6, 0.2 # rest will go for test
train_count = int(len(dataset) * TRAIN_PCT)
validation_count = int(len(dataset) * TRAIN_PCT)
indices = torch.randperm(len(dataset))
train_indices = get_subset(indices, 0, train_count)
validation_indices = get_subset(indices, train_count, validation_count)
test_indices = get_subset(indices, train_count + validation_count, len(dataset))
Run Code Online (Sandbox Code Playgroud)
这将为创建指数SubsetRandomSampler和torch.utils.data.DataLoader。所以,再次类似于@ESZ:
dataloaders = {
"train": torch.utils.data.DataLoader(
dataset, sampler=SubsetRandomSampler(train_indices)
),
"validation": torch.utils.data.DataLoader(
dataset, sampler=SubsetRandomSampler(validation_indices)
),
"test": torch.utils.data.DataLoader(
dataset, sampler=SubsetRandomSampler(test_indices)
),
}
Run Code Online (Sandbox Code Playgroud)
您可以指定batch_size和其他参数DataLoader,如果您需要更多信息,请参阅文档。
| 归档时间: |
|
| 查看次数: |
1990 次 |
| 最近记录: |