我想将图像数据集分成两部分,即训练和测试集。我想在训练和测试之间分割数据80/20。我需要从所有类别的图像中获取80%,我还需要从所有类别的图像中获取剩余的20%的图像。
目前我正在将数据分成两部分,但它无法正常工作。
image_filenames = glob.glob("./imagenet-dogs/n02*/*.jpg")
image_filenames[0:2]
training_dataset = defaultdict(list)
testing_dataset = defaultdict(list)
image_filename_with_breed = map(lambda filename: (filename.split("/")[2], filename), image_filenames)
for dog_breed, breed_images in groupby(image_filename_with_breed, lambda x: x[0]):
"""
Append training/testing image datasets to respective dictionaries
"""
# Enumerate each breed's image and send ~20% of the images to a testing set
for i, breed_image in enumerate(breed_images):
if i % 5 == 0:
testing_dataset[dog_breed].append(breed_image[1])
else:
training_dataset[dog_breed].append(breed_image[1])
我做错了什么,以及确保从所有班级拍摄图像的最佳方法是什么?
将图像随后移动80%,将其附加到训练中然后将剩余的20%用于测试工作?如果是这样,最好的方法是什么?
答案 0 :(得分:0)
这正是分层列车测试分割所做的,例如在sklearn中实现: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedShuffleSplit.html
一般的想法非常简单:
通过这种方式,您可以保证选择每个班级的适当比例(因此分层)。