Python 如何洗牌图像以用于培训和测试

Python 如何洗牌图像以用于培训和测试,python,machine-learning,dataset,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 = defau

我想把一个图像数据集分成两部分,训练和测试。我想在培训和测试之间将数据分成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%,将其附加到测试工作中?如果是这样,那么最好的方法是什么?

这正是分层列车测试拆分所做的,例如在sklearn中实施:

总体思路非常简单:

  • 对于每个C类:
    • 采集所有C类样品
    • 洗牌(以防万一)
    • 先用K%进行训练,剩下的进行测试
  • 洗牌训练并再次测试(单独)

  • 通过这种方式,您可以保证为每个类别选择适当的比率(因此称为分层)。

    不要重新发明轮子。scikit learn实际上是Python中ML实用程序的库。例如,它内置了
    train\u test\u split\u