Keras:在flow_from_directory()中使用多个目录

时间:2018-12-05 17:38:54

标签: python keras

对于大多数数据集,图像是独立的,将80%-20%的图像随机分成train/test/目录以与Keras的flow_from_directory()一起使用没有问题。但是,对于我的应用来说并非如此。例如,假设我要对人们是微笑还是皱着眉头进行分类。我没有使用在网上找到的成千上万随机微笑着皱着眉头的人的图像,而是招募了10名志愿者,并为每位志愿者微笑着皱着眉头的照片100张。在我最终的应用程序中,我想对新用户是微笑还是皱着眉头进行分类。为了进行公平的测试,我必须确保测试集中的用户图像不会出现在训练集中(否则我的分类器可能会选择该用户特定的功能,这是我所不希望的),因此我将其省略一个用户,并在其他九个用户上训练我的模型。我的目录结构如下:

user1/
    smile/
        100 images
    frown/
        100 images
...
user10/
    smile/
        100 images
    frown/
        100 images

有什么方法可以将Keras user1/作为test/目录,而user2/user10/作为train/目录?

注意:我的问题不是this question的重复,因为这涉及到并行输入多个目录以供单个培训示例使用。我的问题类似于this,但该问题写得太差,以至于我不确定用户是否在问我同样的问题。

1 个答案:

答案 0 :(得分:1)

@ TimD1我相信,如果您如下所示稍微更改目录的结构方式,则可以在keras中使用flow_from_directory。

Test_Directory/
             User1/
                  200 images here(don't create separate folders for smile and frown here) 

Train_Directory/
               Smile/
                     All the images for smile for users 2-10 
               Frown/
                     All the images for frown for users 2-10    

一旦有了此目录结构,就可以使用以下代码并根据应用程序的需要更改细节。重要的事情是目录的路径,以及是否要创建验证集。

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                               shear_range = 0.1,
                               zoom_range = 0.1,
                               validation_split=0.1 
                               ) # validation set of 10% from training data

test_datagen = ImageDataGenerator(rescale = 1./255,
                               shear_range = 0.1,
                               zoom_range = 0.1,
                               )

training_set = train_datagen.flow_from_directory('desktop/Train_Directory',target_size = (64,64),shuffle=True,
                                             seed=13,batch_size = 32,class_mode = 'binary',
                                             subset="training")

val_set = train_datagen.flow_from_directory('desktop/Train_Directory',target_size = (64,64),shuffle=True,
                                             seed=13,batch_size = 32,class_mode = 'categorical',
                                             subset="validation")

test_set= test_datagen.flow_from_directory('desktop/Test_Directory',target_size = (input_size,input_size),shuffle=False,
                                             seed=13,class_mode=None,batch_size = 1)# for test the batch size should be set to 1 and the shuffle should be false to get the correct number of outputs in the right order your predicting the test labels

此后,请使用fit_generator进行训练,并使用predict_generator进行测试。如果您选择将shuffle的{​​{1}}设置为True,则需要在预测测试标签之前执行test_set