簡體   English   中英

如何在 keras flow_from_directory 中手動指定類標簽?

[英]How to manually specify class labels in keras flow_from_directory?

問題:我正在訓練一個多標簽圖像識別模型。 因此,我的圖像與多個 y 標簽相關聯。 這與 ImageDataGenerator 的便捷 keras 方法“flow_from_directory”相沖突,其中每個圖像都應該位於相應標簽的文件夾中( https://keras.io/preprocessing/image/ )。

解決方法:目前,我正在將所有圖像讀入一個 numpy 數組並從那里使用“flow”函數。 但這會導致沉重的內存負載和緩慢的讀入過程。

問題:有沒有辦法使用“flow_from_directory”方法並手動提供(多個)類標簽?


更新:我最終為多標簽案例擴展了 DirectoryIterator 類。 您現在可以將屬性“class_mode”設置為值“multilabel”並提供一個字典“multlabel_classes”,它將文件名映射到它們的標簽。 代碼: https : //github.com/tholor/keras/commit/29ceafca3c4792cb480829c5768510e4bdb489c5

您可以簡單地使用flow_from_directory並通過以下方式將其擴展為多類:

def multiclass_flow_from_directory(flow_from_directory_gen, multiclasses_getter):
    for x, y in flow_from_directory_gen:
        yield x, multiclasses_getter(x, y)

multiclasses_getter在哪里為您的圖像分配一個多類向量/您的多類表示。 請注意, xy不是單個示例,而是一批示例,因此這應該包含在您的multiclasses_getter設計中。

您可以編寫一個自定義生成器類,該類將從目錄中讀取文件並應用標簽。 該自定義生成器還可以接收一個 ImageDataGenerator 實例,該實例將使用 flow() 生成批次。

我在想象這樣的事情:

class Generator():

    def __init__(self, X, Y, img_data_gen, batch_size):
        self.X = X
        self.Y = Y  # Maybe a file that has the appropriate label mapping?
        self.img_data_gen = img_data_gen  # The ImageDataGenerator Instance
        self.batch_size = batch_size

    def apply_labels(self):
        # Code to apply labels to each sample based on self.X and self.Y

    def get_next_batch(self):
        """Get the next training batch"""
        self.img_data_gen.flow(self.X, self.Y, self.batch_size)

然后簡單地:

img_gen = ImageDataGenerator(...)
gen = Generator(X, Y, img_gen, 128)

model.fit_generator(gen.get_next_batch(), ...)

*免責聲明:我還沒有實際測試過這個,但理論上應該可行。

# Training the model
history = model.fit(train_generator, steps_per_epoch=steps_per_epoch, epochs=3, validation_data=val_generator,validation_steps=validation_steps, verbose=1,
                    callbacks= keras.callbacks.ModelCheckpoint(filepath='/content/results',monitor='val_accuracy', save_best_only=True,save_weights_only=False))

validation_stepssteps_per_epoch可能會超過原始參數的值。

steps_per_epoch= (int(num_of_training_examples/batch_size)可能會有所幫助。同樣的validation_steps= (int(num_of_val_examples/batch_size)會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM