CNN将图像划分为训练/验证/测试

时间:2019-01-19 00:58:13

标签: python-3.x machine-learning deep-learning conv-neural-network data-science

我正在尝试将图像(兔子和狗的数据集)划分为x_trainx_valy_trainy_val和测试。

以下是我所做的:

我将每个班级(狗/婴儿)的照片放在训练和测试两个文件夹中的单独文件夹中。

培训目录->兔子目录->兔子图片

培训目录->小狗目录->小狗图片

测试目录->兔子目录->兔子图片

测试目录->小狗目录->小狗图片

我使用以下代码从文件夹中获取图像:

training_data = train_datagen.flow_from_directory('./images/train',
                                             target_size = (28, 28),
                                             batch_size = 86,
                                             class_mode = 'binary',
                                             color_mode='rgb',
                                             classes=None)


test_data = test_datagen.flow_from_directory('./images/test',
                                        target_size = (28, 28),
                                        batch_size = 86,
                                        class_mode = 'binary',
                                        color_mode='rgb',
                                        classes=None)

哪个给我以下输出:

  

找到152个属于2类的图像。

     

找到了23个属于2类的图像。

问题1:我不确定如何在此处定义标签(y_val / y_train)或是否需要定义标签(但似乎大多数模型都具有y_val / { {1}}。

问题2:我试图跑步

y_train

为了至少将训练数据分为验证/训练,但是当我尝试运行模型时,出现了以下错误:

x_train, x_val = train_test_split(training_data, test_size=0.1)

ValueError:history=classifier.fit_generator(x_train, steps_per_epoch = (8000 / 86), epochs = 2, validation_data = x_val, validation_steps = 8000/86, callbacks=[learning_rate_reduction]) 应该是元组validation_data(val_x, val_y, val_sample_weight)

  

发现:[(array([[[[0.5058095,0.46913707,0.42369673],...

1 个答案:

答案 0 :(得分:1)

问题1:

根据我的经验,在命名y,x变量时没有明显的局限性。例如,在this内核中,一个人使用y_train, y_test名称作为标签,而here在一个人中使用train_Y。有一条规则,即您应给名称显示变量的含义。

问题2:

我建议使用validation_splitdoc)中的ImageDataGenerator参数来设置为验证保留的图像部分。之后,我建议使用subsetdoc)中的flow_from_directory参数来定义training_generatorvalidation generator变量。 (我想指出,flow_from_directory返回生成器,而不是数据)。

所以您的代码如下:

data_generator = ImageDataGenerator(
    validation_split=0.2,
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
)

train_generator = data_generator.flow_from_directory(
    './images/train',
    target_size = (28, 28),
    batch_size = 86,
    class_mode = 'binary',
    color_mode='rgb',
    classes=None, subset="training"
)

validation_generator = data_generator.flow_from_directory(
    './images/train',
    target_size = (28, 28),
    batch_size = 86,
    class_mode = 'binary',
    color_mode='rgb',
    classes=None, subset="validation"
)

history=classifier.fit_generator(
    train_generator,
    steps_per_epoch = (8000 / 86),
    epochs = 2,
    validation_data = validation_generator,
    validation_steps = 8000/86,
    callbacks=[learning_rate_reduction]
)