web-dev-qa-db-ja.com

Keras:flow_from_directoryを使用して画像拡張をトレーニングデータに適合させる

Kerasで画像拡張を使用したい。私の現在のコードは次のようになります:

_# define image augmentations
train_datagen = ImageDataGenerator(
featurewise_center=True,
featurewise_std_normalization=True,
zca_whitening=True)

# generate image batches from directory
train_datagen.flow_from_directory(train_dir)
_

これを使用してモデルを実行すると、次のエラーが発生します。

_"ImageDataGenerator specifies `featurewise_std_normalization`, but it hasn't been fit on any training data."
_

しかし、train_dataget.fit()を_flow_from_directory_と一緒に使用する方法についての明確な情報は見つかりませんでした。

ご協力ありがとうございました。マリオ

8

あなたは正しいです、 docs はこれについてあまり啓発的ではありません...

必要なのは、実際には4ステップのプロセスです。

  1. データ拡張を定義する
  2. 増強に適合
  3. flow_from_directory()を使用してジェネレーターをセットアップします
  4. fit_generator()を使用してモデルをトレーニングします

架空の画像分類の場合に必要なコードは次のとおりです。

_# define data augmentation configuration
train_datagen = ImageDataGenerator(featurewise_center=True,
                                   featurewise_std_normalization=True,
                                   zca_whitening=True)

# fit the data augmentation
train_datagen.fit(x_train)

# setup generator
train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_height, img_width),
        batch_size=batch_size,
        class_mode='categorical')

# train model
model.fit_generator(
    train_generator,
    steps_per_Epoch=nb_train_samples,
    epochs=epochs,
    validation_data=validation_generator, # optional - if used needs to be defined
    validation_steps=nb_validation_samples) 
_

明らかに、定義する必要のあるパラメーターがいくつかあります(_train_data_dir_、_nb_train_samples_など)が、うまくいけば、あなたはその考えを理解するでしょう。

私の例のように、_validation_generator_も使用する必要がある場合、これは_train_generator_と同じ方法で定義する必要があります。

[〜#〜]更新[〜#〜](コメント後)

ステップ2にはいくつかの議論が必要です。ここで、_x_train_は実際のデータであり、理想的にはメインメモリに収まるはずです。また( ドキュメント )、このステップは

Featurewise_centerまたはfeaturewise_std_normalizationまたはzca_whiteningの場合にのみ必要です。

ただし、すべてのトレーニングデータがメモリに収まるという要件が明らかに非現実的であるという現実のケースは数多くあります。このような場合にデータをどのように中央揃え/正規化/ホワイト化するかは、それ自体が(巨大な)サブフィールドであり、おそらくSparkなどのビッグデータ処理フレームワークが存在する主な理由です。

それで、ここで実際に何をすべきか?このような場合の次の論理アクションは、データをサンプルすることです。確かに、これはまさにコミュニティがアドバイスしていることです-これがKerasの作成者であるFrancois Cholletです Imagenetのような大きなデータセットでの作業

_datagen.fit(X_sample) # let's say X_sample is a small-ish but statistically representative sample of your data
_

そして、 進行中のオープンディスカッション からの別の引用ImageDataGeneratorの拡張について(強調を追加):

機能ごとの標準化とZCAにはfitが必要であり、パラメータとして配列のみを取り、ディレクトリにはfitはありません。 今のところ、ディレクトリにこれを合わせるには、画像のサブセットを手動で読み取る必要があります。 1つのアイデアは、ジェネレータ自体を受け入れるようにfit()を変更できることです(_flow_from_directory_)。もちろん、フィット中は標準化を無効にする必要があります。

お役に立てれば...

16
desertnaut