关于Keras flow_from_dataframe的教程
我在网上找到的大多数图像数据集都有2种常见格式,第一种常见格式包含以各自类名命名的单独文件夹中的所有图像,这是我在网上看到的最常见格式,而Keras允许任何人使用flow_from_directory函数可以轻松地从disc读取图像,并使用ImageDataGenerator执行强大的动态图像增强。
我在网上找到的第二种最常见的格式是,所有图像都存在于一个目录中,它们各自的类映射在CSV或JSON文件中,但Keras之前不支持这种格式,并且必须将图像移动到单独的目录及其各自的类名称或写一个自定义生成器来处理这种情况,函数flow_from_dataframe允许您输入panda dataframe,其中包含文件名(带有或不带有扩展名)列和具有类名的列,并直接从目录中读取图像,并映射它们各自的类名。
要使用flow_from_dataframe函数,您需要安装pandas。
你可以做到这一点pip install pandas
以前,如果他们必须执行回归或预测多个列并使用ImageDataGenerator的图像增强功能,则必须编写自定义生成器,现在您可以将目标值仅作为另一列(必须是数值数据类型)放在您的dataframe中,只需将列名提供给flow_from_dataframe就可以了!现在,您现在可以使用ImageDataGenerator提供的所有扩展。
首先,下载数据集并将图像文件保存在单个目录下。
例如,我将使用数据集https://www.kaggle.com/c/cifar-10/data
如果您下载并解压缩train.7z和test.7z,您将会得到两个名为“train”和“test”的文件夹,每个文件夹都包含这些文件夹下的所有图片,你还需要下载trainLabels.csv文件,该文件将训练图像的文件名映射到它们各自的类。
现在让我们导入所需的Python库,并用pandas读取CSV文件。
from keras.models import Sequential from keras.preprocessing.image import ImageDataGenerator from keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization from keras.layers import Conv2D, MaxPooling2D from keras import regularizers, optimizers import pandas as pd traindf=pd.read_csv(“./trainLabels.csv”)
如果你看traindf的前5行,你会发现:
“id”列只是“train”文件夹下的图像的文件名(但是它没有文件名扩展名),“label”列有它们各自的类名。
datagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)
注意,我将train集分割为两组,一组用于训练,另一组用于验证,方法是指定validation_split=0.25,该参数将数据集分割为两组,其中验证集占总图像的25%。
如果希望,还可以将dataframe显式拆分为2,并将dataframe传递给两个不同的flow_from_dataframe函数。
train_iter=datagen.flow_from_dataframe( dataframe=traindf, directory="./train/", x_col="id", y_col="label", has_ext=False, subset="training", class_mode="categorical", target_size=(32,32)) valid_iter=datagen.flow_from_dataframe( dataframe=traindf, directory="./train/", x_col="id", y_col="label", has_ext=False, subset="validation", class_mode="categorical", target_size=(32,32))
由于我使用validation_split来分割数据集,因此必须指定哪个集合用于哪个flow_from_dataframe函数。所以,我们有这个子集参数,它接受“训练”或“验证”。
具体参数flow_from_dataframe:
- dataframe -传递Pandas dataframe。
- directory - (str)包含所有图像的目录的路径。
注意:将找到此目录下的所有有效图像,但仅使用与x_col中的数据匹配的文件名。
- x_col - (str)包含图像文件名的列的名称。
- y_col - (str或str的列表)如果class_mode不是“other”或不是“input”,则应传递包含类名的列的名称。
- has_ext - (bool)如果数据框中的x_col(本例中为“id”)列具有文件扩展名(在本例中为False)。
- class_mode - (str)与flow_from_directory类似,它接受“categorical”(默认),“binary”,“sparse”,“input”,None 以及额外参数“other”。
如果class_mode设置为“ other“它将dataframe 的列或列中的数据列的dataframe原始目标值(这意味着您应该确保这些列中的数据必须是数值数据类型),如果你正在为回归任务建立一个模型,比如从steering wheel的图像中预测角度,或者建立一个需要同时预测多个值的模型,这将会很有帮助。
建立机器学习模型,Python代码如下:
model = Sequential() model.add(Conv2D(32, (3, 3), padding='same', input_shape=(32,32,3))) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) model.compile(optimizers.rmsprop(lr=0.0001, decay=1e-6),loss="categorical_crossentropy",metrics=["accuracy"])
适合机器学习模型,Python代码如下:
STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size STEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size model.fit_generator(generator=train_generator, steps_per_epoch=STEP_SIZE_TRAIN, validation_data=valid_generator, validation_steps=STEP_SIZE_VALID, epochs=10 )
要预测模型,您应该使用flow_from_directory,因为使用没有类名的数据框没有意义,而是可以从目录中找到图像并从中进行预测。