關於Keras flow

關於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文件,該文件將訓練圖像的文件名映射到它們各自的類。

關於Keras flow_from_dataframe的教程

現在讓我們導入所需的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行,你會發現:

關於Keras flow_from_dataframe的教程

“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,因為使用沒有類名的數據框沒有意義,而是可以從目錄中找到圖像並從中進行預測。


分享到:


相關文章: