Python Keras:如何扩展验证分割以生成第三个集,即测试集?

Python Keras:如何扩展验证分割以生成第三个集,即测试集?,python,tensorflow,keras,Python,Tensorflow,Keras,我正在使用带有TensorFlow后端的Keras。我使用带有validation_split参数的ImageDataGenerator将数据拆分为序列集和验证集。因此,我使用来自目录的flow_,子集设置为“training”和“testing”,如下所示: 这非常方便,因为它只允许我使用一个目录而不是两个(一个用于培训,一个用于验证)。现在我想知道是否可以扩展此过程以生成第三个集合,即测试集合?这是不可能的。您应该能够通过对ImageDataGenerator的功能进行一些小的修改来完成此操

我正在使用带有TensorFlow后端的Keras。我使用带有validation_split参数的ImageDataGenerator将数据拆分为序列集和验证集。因此,我使用来自目录的flow_,子集设置为“training”和“testing”,如下所示:


这非常方便,因为它只允许我使用一个目录而不是两个(一个用于培训,一个用于验证)。现在我想知道是否可以扩展此过程以生成第三个集合,即测试集合?

这是不可能的。您应该能够通过对
ImageDataGenerator
的功能进行一些小的修改来完成此操作:

if subset is not None:
    if subset not in {'training', 'validation'}: # add a third subset here
        raise ValueError('Invalid subset name:', subset,
                         '; expected "training" or "validation".') # adjust message
    split_idx = int(len(x) * image_data_generator._validation_split) 
    # you'll need two split indices here
    if subset == 'validation':
        x = x[:split_idx]
        x_misc = [np.asarray(xx[:split_idx]) for xx in x_misc]
        if y is not None:
            y = y[:split_idx]
    elif subset == '...' # add extra case here

    else:
        x = x[split_idx:]
        x_misc = [np.asarray(xx[split_idx:]) for xx in x_misc] # change slicing
        if y is not None:
            y = y[split_idx:] # change slicing
编辑:这是修改代码的方法:

if subset is not None:
    if subset not in {'training', 'validation', 'test'}:
        raise ValueError('Invalid subset name:', subset,
                         '; expected "training" or "validation" or "test".')
    split_idxs = (int(len(x) * v) for v in image_data_generator._validation_split)
    if subset == 'validation':
        x = x[:split_idxs[0]]
        x_misc = [np.asarray(xx[:split_idxs[0]]) for xx in x_misc]
        if y is not None:
            y = y[:split_idxs[0]]
    elif subset == 'test':
        x = x[split_idxs[0]:split_idxs[1]]
        x_misc = [np.asarray(xx[split_idxs[0]:split_idxs[1]]) for xx in x_misc]
        if y is not None:
            y = y[split_idxs[0]:split_idxs[1]]
    else:
        x = x[split_idxs[1]:]
        x_misc = [np.asarray(xx[split_idxs[1]:]) for xx in x_misc]
        if y is not None:
            y = y[split_idxs[1]:]
基本上,
validation\u split
现在应该是两个浮点的元组,而不是一个浮点。验证数据将是介于0和
验证分割[0]
之间的数据、介于
验证分割[0]和验证分割[1]
之间的测试数据以及介于
验证分割[1]
和1之间的训练数据的分数。您可以这样使用它:

import keras
# keras_custom_preprocessing is how i named my directory
from keras_custom_preprocessing.image import ImageDataGenerator

generator = ImageDataGenerator(validation_split=(0.1, 0.5))
# First 10%: validation data - next 40% test data - rest: training data        
gen = generator.flow_from_directory(directory='./data/', subset='test')
# Finds 40% of the images in the dir

您将需要在另外两行或三行中修改该文件(您必须更改一个类型检查),但仅此而已,应该可以正常工作。我有修改过的文件,让我知道如果你有兴趣,我可以把它放在我的github上

请分享您的代码,我将为您的回购打上星号:)对不起,我无法检索我当时使用的文件-我已经很久没有回答这个问题了。
import keras
# keras_custom_preprocessing is how i named my directory
from keras_custom_preprocessing.image import ImageDataGenerator

generator = ImageDataGenerator(validation_split=(0.1, 0.5))
# First 10%: validation data - next 40% test data - rest: training data        
gen = generator.flow_from_directory(directory='./data/', subset='test')
# Finds 40% of the images in the dir