web-dev-qa-db-ja.com

ImageDataGeneratorはデータセットに画像を追加しますか?

Inception V3モデルで画像分類を実行しようとしています。 KerasのImageDataGeneratorは、データセットに追加される新しい画像を作成しますか? 1000個の画像がある場合、この関数を使用すると、トレーニングに使用される2000個の画像に2倍になりますか?作成され、現在モデルに供給されている画像の数を知る方法はありますか?

10
student17

短い答え:1)すべての元の画像が変換されます(つまり、回転、ズームなど)すべてのエポック次にトレーニングに使用されます。2)[したがって]各エポックの画像の数は、元の画像の数と同じです。

長い答え:各エポックでは、 ImageDataGenerator は、使用している画像に変換を適用し、トレーニング用に変換された画像。変換のセットには、回転、ズームなどが含まれます。これを行うことで、どういうわけか新しいデータ(つまり、data augmentationとも呼ばれます)が作成されますが、生成された画像はまったく異なりませんオリジナルのものから。このようにして、学習されたモデルは、同じ画像のさまざまなバリエーションでトレーニングされるため、より堅牢で正確になる可能性があります。

fitメソッドのsteps_per_Epoch引数をn_samples / batch_sizeに設定する必要があります。ここで、n_samplesは、保持しているトレーニングデータの総数です(つまり、この場合は1000)。このように、各エポックでは、各トレーニングサンプルが1回だけ拡張されるため、各エポックで1000の変換画像が生成されます。

12
today

公式に書かれているように 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を使用すると、この方法で役立ちます。

4
Ioannis Nasios

@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にして手動で停止しました)。ジェネレーターは、拡張されているかどうかに関係なく、要求された数の画像を提供します。

2
Ognjen Mišić

私もこの質問を心に留めていたので、ここに私の答えを示します。

ImageDataGeneratorは、エポックを大きくしないという意味では、データセットに新しい画像を追加しません。代わりに、各エポックで(構成に応じて)わずかに変更された画像を提供します。エポックの数に関係なく、常に新しい画像が生成されます。

したがって、各エポックモデルでは、異なる画像でトレーニングしますが、異なる画像ではありません。これにより、過剰適合が防止され、何らかの方法でオンライン学習がシミュレートされます。

これらの変更はすべてメモリ内で行われますが、これらの画像を表示したい場合は、ディスクに保存して検査し、生成されたものを確認して、ImageDataGeneratorがどのように機能するかを理解してください。これを行うには、save_to_dir=/tmp/img-data-gen-outputsから関数flow_from_directorydocs を参照してください。

1
Marko

データが少ないという問題を解決しようとするとき、拡張画像を追加してデータセットを増やすのは良い考えではありませんか?

https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced

上記のリンクを参考にして、著者がトレーニングデータセットに拡張画像を追加する力について言及しました。

したがって、何をすべきか、画像とsave_to_dirを増やしてモデルをトレーニングするか、またはsteps_per_Epochを使用するか=2 *(n_samples/batch_size)そして、エポックあたりのデータ量を2倍にトレーニングしますか?

0
Sahil Singla

また、次の点にも注意してください。これらの拡張画像はメモリに保存されず、トレーニング中にオンザフライで生成され、トレーニング後に失われます。これらの拡張された画像をもう一度読むことはできません。

すぐに大量の画像を保存するとすぐにメモリ不足になるため、これらの画像を保存しないことは良い考えです

0
krishna