我已经在互联网上搜索了数小时,以找到解决我问题的好方法。以下是一些相关的背景信息,可帮助您回答我的问题。
这是我的第一个深度学习项目,我不知道自己在做什么。我了解理论但不了解实际要素。
我正在使用的数据可以在以下链接的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中的文件夹划分的这些图像创建所需的标签/类?
答案 0 :(得分:4)
看看来自Kaggle的数据和代码,数据加载会出现问题。
对于每个类标签,数据应位于不同的文件夹中,以便PyTorch ImageFolder
正确加载。在您的情况下,由于所有训练数据都在同一文件夹中,因此PyTorch会将其作为一个训练集加载。您可以使用以下文件夹结构来更正此问题:-train/daisy
,train/dandelion
,test/daisy
,test/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))