web-dev-qa-db-ja.com

keras flow_from_directoryでクラスラベルを手動で指定する方法は?

問題:マルチラベル画像認識のモデルをトレーニングしています。したがって、私の画像は複数のyラベルに関連付けられています。これは、ImageDataGeneratorの便利なkerasメソッド「flow_from_directory」と競合しています。各画像は、対応するラベルのフォルダー内にあると想定されています( https://keras.io/preprocessing/image/ ) 。

回避策:現在、私はすべての画像をnumpy配列に読み込んでおり、そこから「フロー」関数を使用しています。ただし、これにより、メモリの負荷が高くなり、読み込みプロセスが遅くなります。

質問:「flow_from_directory」メソッドを使用し、(複数の)クラスラベルを手動で提供する方法はありますか?


Update:最終的に、マルチラベルの場合のDirectoryIteratorクラスを拡張しました。属性 "class_mode"を値 "multilabel"に設定し、ファイル名をラベルにマップする辞書 "multlabel_classes"を提供できるようになりました。コード: https://github.com/tholor/keras/commit/29ceafca3c4792cb480829c5768510e4bdb489c5

17
Malte

ディレクトリからファイルを読み取り、ラベル付けを適用するカスタムジェネレータークラスを作成できます。このカスタムジェネレーターは、flow()を使用してバッチを生成するImageDataGeneratorインスタンスを取り込むこともできます。

私はこのような何かを想像しています:

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(), ...)

*免責事項:実際にこれをテストしたことはありませんが、理論上は機能するはずです。

2
gaw89

単に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デザインに含める必要があります。

8
Marcin Możejko