Inception V3モデルで画像分類を実行しようとしています。 KerasのImageDataGenerator
は、データセットに追加される新しい画像を作成しますか? 1000個の画像がある場合、この関数を使用すると、トレーニングに使用される2000個の画像に2倍になりますか?作成され、現在モデルに供給されている画像の数を知る方法はありますか?
短い答え:1)すべての元の画像が変換されます(つまり、回転、ズームなど)すべてのエポック次にトレーニングに使用されます。2)[したがって]各エポックの画像の数は、元の画像の数と同じです。
長い答え:各エポックでは、 ImageDataGenerator
は、使用している画像に変換を適用し、トレーニング用に変換された画像。変換のセットには、回転、ズームなどが含まれます。これを行うことで、どういうわけか新しいデータ(つまり、data augmentationとも呼ばれます)が作成されますが、生成された画像はまったく異なりませんオリジナルのものから。このようにして、学習されたモデルは、同じ画像のさまざまなバリエーションでトレーニングされるため、より堅牢で正確になる可能性があります。
fit
メソッドのsteps_per_Epoch
引数をn_samples / batch_size
に設定する必要があります。ここで、n_samples
は、保持しているトレーニングデータの総数です(つまり、この場合は1000)。このように、各エポックでは、各トレーニングサンプルが1回だけ拡張されるため、各エポックで1000の変換画像が生成されます。
公式に書かれているように hereImageDataGenerator
は、リアルタイムデータ拡張機能を備えたテンソル画像データのバッチジェネレータです。データは(バッチで)ループされます。これは、オンザフライで画像のバッチに変換を適用することを意味しますrandomly。例えば:
train_datagen = ImageDataGenerator(
rescale=1./255, #scale images from integers 0-255 to floats 0-1.
shear_range=0.2,
zoom_range=0.2, # zoom in or out in images
horizontal_flip=True) #horizontal flip of images
新しいエポックごとに新しいランダム変換が適用され、このようにして、少しずつ異なる画像で一度にトレーニングします。より多くのデータを取得することは、常に達成可能または可能であるとは限りません。ImageDataGenerator
を使用すると、この方法で役立ちます。
@todayが回答したように、実行するエポックの数にすべて依存します。モデルをジェネレーターに合わせると、ジェネレーターはsteps_per_Epoch
に応じて必要な数の画像を提供します。
物事をわかりやすくするために、20個の画像を2つのフォルダーに分類し(分類されたデータを模倣)、親フォルダーからジェネレーターを作成し、単純なforループを実行します
count = 0
for image, label in my_test_generator:
count += 1
print(count)
最初に、メッセージFound 20 images belonging to 2 classes.
が表示されることを確認する必要があります。ループ自体は20回の反復後に停止しませんが、無限に増加して印刷し続けます(私は10kにして手動で停止しました)。ジェネレーターは、拡張されているかどうかに関係なく、要求された数の画像を提供します。
私もこの質問を心に留めていたので、ここに私の答えを示します。
ImageDataGenerator
は、エポックを大きくしないという意味では、データセットに新しい画像を追加しません。代わりに、各エポックで(構成に応じて)わずかに変更された画像を提供します。エポックの数に関係なく、常に新しい画像が生成されます。
したがって、各エポックモデルでは、異なる画像でトレーニングしますが、異なる画像ではありません。これにより、過剰適合が防止され、何らかの方法でオンライン学習がシミュレートされます。
これらの変更はすべてメモリ内で行われますが、これらの画像を表示したい場合は、ディスクに保存して検査し、生成されたものを確認して、ImageDataGenerator
がどのように機能するかを理解してください。これを行うには、save_to_dir=/tmp/img-data-gen-outputs
から関数flow_from_directory
。 docs を参照してください。
データが少ないという問題を解決しようとするとき、拡張画像を追加してデータセットを増やすのは良い考えではありませんか?
上記のリンクを参考にして、著者がトレーニングデータセットに拡張画像を追加する力について言及しました。
したがって、何をすべきか、画像とsave_to_dirを増やしてモデルをトレーニングするか、またはsteps_per_Epochを使用するか=2 *(n_samples/batch_size)そして、エポックあたりのデータ量を2倍にトレーニングしますか?
また、次の点にも注意してください。これらの拡張画像はメモリに保存されず、トレーニング中にオンザフライで生成され、トレーニング後に失われます。これらの拡張された画像をもう一度読むことはできません。
すぐに大量の画像を保存するとすぐにメモリ不足になるため、これらの画像を保存しないことは良い考えです