如何将图像随机播放以用于训练和测试

时间:2017-07-07 17:12:02

标签: python machine-learning dataset

我想将图像数据集分成两部分,即训练和测试集。我想在训练和测试之间分割数据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%用于测试工作?如果是这样,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

这正是分层列车测试分割所做的,例如在sklearn中实现: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedShuffleSplit.html

一般的想法非常简单:

  1. 每个班级C:
    • 取所有属于C类的样本
    • 改组他们(以防万一)
    • 先拿K%训练,继续测试
  2. 随机训练并再次测试(另外)
  3. 通过这种方式,您可以保证选择每个班级的适当比例(因此分层)。