图像数据集划分与Keras数据生成器标签及验证集问题求助
我来帮你理清这两个问题,都是Keras图像生成器使用中常见的小坑:
问题1:关于y_train/y_val标签的疑问
首先,你用flow_from_directory创建的training_data和test_data都是数据生成器对象,不是单纯的特征数组。这个生成器在每次迭代的时候,会自动返回一个元组(batch_x, batch_y)——其中batch_x是一批图像数据,batch_y就是对应的标签(因为你设置了class_mode='binary',所以标签是0/1的二进制值)。
所以你不需要手动去定义单独的y_train或y_val变量,生成器已经帮你把特征和标签绑定好了。当你用fit(现在Keras更推荐用这个替代fit_generator)训练时,直接传入这个生成器就行,它会自动处理特征和标签的配对。
问题2:拆分训练集与验证集的错误解决
你用train_test_split拆分training_data是行不通的,因为train_test_split是用来处理内存中的数组数据,而flow_from_directory返回的是迭代器,不是数组。这就导致拆分后的x_val不符合模型期望的(val_x, val_y)元组格式,所以会抛出那个ValueError。
这里有两种靠谱的解决方法:
方法1:用生成器自带的validation_split参数
你可以在定义train_datagen的时候,加上validation_split参数指定验证集比例,然后分别创建训练和验证生成器:
# 初始化数据生成器时指定验证集比例(记得加上数据预处理,比如归一化) train_datagen = ImageDataGenerator( rescale=1./255, validation_split=0.1 # 拿出10%的数据作为验证集 ) # 创建训练集生成器,subset设为'training' training_data = train_datagen.flow_from_directory( './images/train', target_size=(28, 28), batch_size=86, class_mode='binary', color_mode='rgb', subset='training' # 指定这是训练子集 ) # 创建验证集生成器,subset设为'validation' val_data = train_datagen.flow_from_directory( './images/train', target_size=(28, 28), batch_size=86, class_mode='binary', color_mode='rgb', subset='validation' # 指定这是验证子集 ) # 训练模型时直接传入两个生成器,用生成器自身的samples属性计算步数更准确 history = classifier.fit( training_data, steps_per_epoch=training_data.samples // training_data.batch_size, epochs=2, validation_data=val_data, validation_steps=val_data.samples // val_data.batch_size, callbacks=[learning_rate_reduction] )
方法2:手动划分文件夹结构
如果你想更直观地控制训练和验证数据,可以把原训练文件夹里的文件手动拆分到train和val两个子文件夹中,结构如下:
images/ ├── train/ │ ├── Bunny/ │ └── Puppy/ ├── val/ │ ├── Bunny/ │ └── Puppy/ └── test/ ├── Bunny/ └── Puppy/
然后分别用flow_from_directory加载三个生成器:
training_data = train_datagen.flow_from_directory( './images/train', target_size=(28, 28), batch_size=86, class_mode='binary', color_mode='rgb' ) val_data = val_datagen.flow_from_directory( './images/val', target_size=(28, 28), batch_size=86, class_mode='binary', color_mode='rgb' ) test_data = test_datagen.flow_from_directory( './images/test', target_size=(28, 28), batch_size=86, class_mode='binary', color_mode='rgb' )
这种方法的好处是你可以完全控制哪些数据进训练集、哪些进验证集,适合需要特定数据划分的场景。
内容的提问来源于stack exchange,提问作者user10908656

