私は MobileNet と TensorFlow 2 を使用して、かなり似た 4 つのおもちゃを区別しています。おもちゃごとに正確に 750 枚の画像と、750 枚の「ネガティブ」画像を含む 1 つのラベルがあり、おもちゃはありません。
以前に MobileNet を使用してかなりの成功を収めたことがありますが、このケースでは多くのオーバーフィッティングが発生しています (トレーニングと検証の精度の間に約 30 ~ 40% の不一致があります)。モデルは 3 エポックで約 99.8% のトレーニング精度まで非常に迅速にトレーニングされますが、検証精度は約 75% にとどまります。検証データ セットは、入力画像の 20% のランダム セットです。モデルの精度を見ると、おもちゃの 1 つに強い偏りがあり、他の多くのおもちゃがそのおもちゃとして誤って識別されています。
私はこれに対抗するためにそこにあるほとんどすべてを試しました:
MobileNet の上部に追加された Conv2D レイヤーの後に Dropout を追加し、0.2 から 0.9 の間でさまざまなドロップアウト率を試しました。
model = tf.keras.Sequential([
base_model,
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(label_count, activation='softmax')
])
Conv2D レイヤーの前に Dropout レイヤーを追加しました。これにより、わずかに改善されたようです。
model = tf.keras.Sequential([
base_model,
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(label_count, activation='softmax')
])
また、さまざまな照明条件と背景でおもちゃの写真を混ぜ合わせて、ランダムな背景に重ね合わせたおもちゃの画像を生成して、テスト データを追加しました。これらのいずれも重大な影響はありません。
ドロップアウトの後に追加するレイヤーだけでなく、MobileNet モデルにドロップアウトを追加する必要がありますか? これを行う github でこのコードに出くわしましたが、これが実際に良いアイデアであるかどうか、または TensorFlow 2 でこれを達成する方法がまったくわかりません。
これは賢明ですか、それとも実行可能ですか?
あるいは、私が考えることができる唯一の他のアイデアは次のとおりです。
- トレーニングを難しくするために、より多くの画像をキャプチャしてください。
- MobileNet を使用しないでください。ニューラル ネットワークを最初から作成するか、別の既存のものを使用してください。