問題:マルチラベル画像認識のモデルをトレーニングしています。したがって、私の画像は複数の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
ディレクトリからファイルを読み取り、ラベル付けを適用するカスタムジェネレータークラスを作成できます。このカスタムジェネレーターは、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(), ...)
*免責事項:実際にこれをテストしたことはありませんが、理論上は機能するはずです。
単に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
は、画像にマルチクラスベクトル/マルチクラス表現を割り当てています。 x
とy
は単一のサンプルではなく、サンプルのバッチなので、multiclasses_getter
デザインに含める必要があります。