如何将基于图像的自定义数据集加载到Pytorch中以与CNN一起使用?

时间:2018-07-29 04:43:40

标签: python-3.x machine-learning conv-neural-network pytorch

我已经在互联网上搜索了数小时,以找到解决我问题的好方法。以下是一些相关的背景信息,可帮助您回答我的问题。

这是我的第一个深度学习项目,我不知道自己在做什么。我了解理论但不了解实际要素。

我正在使用的数据可以在以下链接的kaggle上找到: (https://www.kaggle.com/alxmamaev/flowers-recognition

我的目标是使用CNN根据数据集中提供的图像对花朵进行分类。

到目前为止,我尝试使用以下示例代码来加载数据,这是我的最佳尝试,但是正如我提到的那样,我一无所知,Pytorch文档并没有提供我可以理解的很多帮助。 (https://pastebin.com/fNLVW1UW

    # Loads the images for use with the CNN.
def load_images(image_size=32, batch_size=64, root="../images"):
    transform = transforms.Compose([
        transforms.Resize(32),
        transforms.ToTensor(),
        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

    train_set = datasets.ImageFolder(root=root, train=True, transform=transform)
    train_loader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, num_workers=2)

    return train_loader


# Defining variables for use with the CNN.
classes = ('daisy', 'dandelion', 'rose', 'sunflower', 'tulip')
train_loader_data = load_images()

# Training samples.
n_training_samples = 3394
train_sampler = SubsetRandomSampler(np.arange(n_training_samples, dtype=np.int64))

# Validation samples.
n_val_samples = 424
val_sampler = SubsetRandomSampler(np.arange(n_training_samples, n_training_samples + n_val_samples, dtype=np.int64))

# Test samples.
n_test_samples = 424
test_sampler = SubsetRandomSampler(np.arange(n_test_samples, dtype=np.int64))

以下是我的直接问题,我也需要回答:

  • 如何修复代码以80/10/10分割的形式加载到数据集中进行训练/测试/验证?

  • 我如何为已被/ images中的文件夹划分的这些图像创建所需的标签/类?

2 个答案:

答案 0 :(得分:4)

看看来自Kaggle的数据和代码,数据加载会出现问题。

对于每个类标签,数据应位于不同的文件夹中,以便PyTorch ImageFolder正确加载。在您的情况下,由于所有训练数据都在同一文件夹中,因此PyTorch会将其作为一个训练集加载。您可以使用以下文件夹结构来更正此问题:-train/daisytrain/dandeliontest/daisytest/dandelion,然后将火车和测试文件夹传递到火车并测试{{ 1}}。只需更改文件夹结构,就可以了。看一下torchvision.datasets.Imagefolder的官方文档,其中有一个类似的例子。


正如您所说,这些图像已经被ImageFolder中的文件夹划分了。 PyTorch /images假定图像的组织方式如下。但是,仅当您将所有图像用于火车设置时,此文件夹结构才是正确的:

ImageFolder

其中“雏菊”,“蒲公英”等是类标签。

如果要根据情况将数据集分为训练和测试集,请使用正确的文件夹结构(请注意,我知道您希望将数据集分为训练,验证和测试集,但这并不重要。只是将想法表达出来的一个示例):

```
/images/daisy/100080576_f52e8ee070_n.jpg
/images/daisy/10140303196_b88d3d6cec.jpg
.
.
.
/images/dandelion/10043234166_e6dd915111_n.jpg
/images/dandelion/10200780773_c6051a7d71_n.jpg
```

然后,您可以参考以下有关如何编写数据加载器的完整代码示例:

```
/images/train/daisy/100080576_f52e8ee070_n.jpg
/images/train/daisy/10140303196_b88d3d6cec.jpg
.
.
/images/train/dandelion/10043234166_e6dd915111_n.jpg
/images/train/dandelion/10200780773_c6051a7d71_n.jpg
.
.
/images/test/daisy/300080576_f52e8ee070_n.jpg
/images/test/daisy/95140303196_b88d3d6cec.jpg
.
.
/images/test/dandelion/32143234166_e6dd915111_n.jpg
/images/test/dandelion/65200780773_c6051a7d71_n.jpg
```

答案 1 :(得分:1)

现在有一个简单的拆分包,称为“拆分文件夹”。见here
例如

import splitfolders
splitfolders.ratio(image_path, output="output", seed=43, ratio=(.8,.1,.1))