ステップバイステップvgg16初心者のためのKerasでの実装

VGG16は、2014年にILSVR(Imagenet)競争に勝つために使用された畳み込みニューラルネット(CNN)アーキテクチャで これは、日付までの優れたビジョンモデルアーキテクチャの一つであると考えられています。 VGG16についての最もユニークなことは、ハイパーパラメータの数が多いのではなく、ストライド1の3×3フィルタの畳み込み層を持つことに焦点を当て、常に同じパディングとストライド2の2×2フィルタのmaxpool層を使用したことです。 これは、アーキテクチャ全体を通して一貫して畳み込み層と最大プール層のこの配置に従います。 最終的には、2つのFC(完全に接続された層)に続いて出力用のsoftmaxがあります。 VGG16の16は、重みを持つ16の層を持っていることを指します。 このネットワークはかなり大規模なネットワークであり、約138万(約)のパラメータを持っています。div>

VGG16のアーキテクチャ

https://www.kaggle.com/c/dogs-vs-cats/data

画像をダウンロードしたら、以下の手順に進むことができます。ここでは、最初にVGG16を実装する必要があるすべてのライブラリをインポートします。 シーケンシャルモデルを作成しているので、シーケンシャルメソッドを使用します。 シーケンシャルモデルは、モデルのすべてのレイヤーが順番に配置されることを意味します。 ここで私はkerasからImageDataGeneratorをインポートしました。前処理。 ImageDataGeneratorの目的は、ラベル付きのデータをモデルに簡単にインポートすることです。 それは、再スケール、回転、ズーム、フリップなどに多くの機能を持っているので、それは非常に便利なクラスです。 このクラスの最も有用な点は、ディスクに保存されているデータに影響を与えないことです。 このクラスは、データをモデルに渡しながら、外出先でデータを変更します。ここでは、トレーニングデータとテストデータの両方のImageDataGeneratorのオブジェクトを作成し、trainデータを持つフォルダをオブジェクトtrdataに渡し、同様にテストデータを持つフ データのフォルダ構造は次のようになります-

渡されるデータのフォルダ構造imagedatagenerator

imagedatageneratorは自動的にcatフォルダ内のすべてのデータをcatおよびvis-à-vis for dogフォルダとしてラベル付けします。 このようにして、データは簡単にニューラルネットワークに渡される準備ができています。ここでは、モデルがシーケンシャルモデルであることを指定してモデルを初期化することから始めました。 モデルを初期化した後、私は追加します

→2x畳み込み層の64チャンネルの3×3カーネルと同じパディング

→1x maxpool層の2×2プールサイズとstride2x2

→2x畳み込み層の128チャンネルの3×3カーネルと同じパディング

→1x maxpool層の2×2プールサイズとstride2x2

→3x畳み込み層の128チャンネルの3×3カーネルと同じパディング

→1x maxpool層の2×2プールサイズとstride2x2

→3x畳み込み層の1x畳み込み層の2x畳み込み

→3x畳み込み層の3x畳み込み

→3x畳み込み

→3x畳み込み256チャンネルの3×3カーネルと同じパディングの層

→1×2プールサイズとストライド2×2のmaxpool層

→3xたたみ込み層512チャンネルの3×3カーネルと同じパディング

→1×2プールサイズとストライド2×2のmaxpool層

→1×2プールサイズとストライド2×2のmaxpool層

→1×2プールサイズとストライド2×2のmaxpool層

→1×2プールサイズとストライド2×2のmaxpool層

→1×2プールサイズとストライド2×2のmaxpool層

→3xたたみ込み層の512チャネルの3×3カーネルと同じパディング

→1x maxpool層の2×2プールサイズとストライド2×2

すべての負の値が次の層に渡されないように、各層にrelu(整流線形単位)活性化を追加します。

model.add(Flatten())model.add(Dense(units=4096,activation="relu"))model.add(Dense(units=4096,activation="relu"))model.add(Dense(units=2, activation="softmax"))

すべての畳み込みを作成した後、データを密な層に渡すので、畳み込みから出てくるベクトルを平らにして追加します

→1×4096単位の密な層

→1×4096単位の密な層

→1×2単位の密なソフトマックス層

私はRELUアクティベーションを使用します。私はネットワークを介して負の値を転送停止するように4096単位の密な層。 私は犬と猫である最後から予測する2つのクラスを持っているので、私はsoftmaxの活性化で最後に2単位の密な層を使用します。 Softmax層は、画像が属するクラスのモデルの信頼度に基づいて、0~1の間の値を出力します。

softmax層の作成後、モデルは最終的に準備されます。 今私はモデルをコンパイルする必要があります。ここでは、Adam optimiserを使用して、モデルをトレーニングしながらグローバル最小値に到達します。 トレーニング中にローカル最小値に固執している場合、adam optimiserはローカル最小値から抜け出してグローバル最小値に到達するのに役立ちます。 この場合は0.001に設定されています。 私たちの訓練がエポックにたくさん跳ね返っているならば、私たちはグローバルな最小値に達することができるように学習率を減らす必要があ以下のコードを使用して、作成したモデルの概要を確認できます。

model.summary()

これの出力は、私が作成したモデルの要約になります。p>

モデルの概要

モデルの作成後、kerasからmodelcheckpointとearlystoppingメソッドをインポートします。 私は両方のオブジェクトを作成し、それをコールバック関数としてfit_generatorに渡します。

ModelCheckpointは、モデルの特定のパラメータを監視することにより、モデルを保存するのに役立ちます。 この場合、Val_accをModelCheckpointに渡して検証の精度を監視しています。 モデルは、現在のエポックでのモデルの検証精度が最後のエポックでの検証精度よりも大きい場合にのみ、ディスクに保存されます。

EarlyStoppingは、EarlyStoppingで監視するように設定したパラメータの増加がない場合、モデルのトレーニングを早期に停止するのに役立ちます。 この場合、Val_accをEarlyStoppingに渡して検証の精度を監視しています。 私はここで忍耐を20に設定しました、つまり、20の時代に検証精度の上昇が見られなければ、モデルは訓練を停止します。私はモデルを使用しています。

モデルにデータを渡すためにImageDataGeneratorを使用しているため、fit_generator。 列車とテストデータをfit_generatorに渡します。 Fit_generatorでは、steps_per_epochはトレーニングデータをモデルに渡すバッチサイズを設定し、validation_stepsはテストデータに対して同じことを行います。 システムの仕様に基づいて微調整することができます。

上記の行を実行すると、モデルはトレーニングを開始し、トレーニング/検証の精度と損失が表示されます。p>

モデルのトレーニング
モデルのトレーニング

モデルを訓練したら、訓練/検証の精度と損失を視覚化することができます。 あなたが気づいたかもしれないように、私はmodeの出力を渡しています。fit_generatorをhist変数に設定します。 すべてのトレーニング/検証の精度と損失はhistに保存され、そこから視覚化します。ここでは、matplotlibを使用してトレーニング/検証の精度と損失を視覚化します。p>

トレーニング/検証精度と損失
トレーニング/検証精度と損失
訓練されたモデルで予測を行うには、最良の保存されたモデルをロードし、画像を前処理し、出力のために画像をモデルに渡す必要があります。div>

モデルの出力
モデルの出力
モデルの出力

モデルの出力
ここでは、kerasのimageメソッドを使用して画像をロードし、それをnumpy配列に変換し、kerasのnhwc(number、height、width、channel)形式に一致させるために画像に余分な次元を追加しました。これは、ImageDataGeneratorを使用してkerasでVGG16を完全に実装したものです。 このモデルを任意の数のクラスで動作させるには、最後のsoftmax密層の単位を分類する必要があるクラスに基づいて必要な数に変更します

Github repo link:https://github.com/1297rohit/VGG16-In-Keras

データ量が少ない場合は、最初からモデルをトレーニングするのではなく、Transfer Learningを試すことができます。 私はまた、Kerasを使用してVGG16で転送学習を実行する上で初心者のためのステップバイステップガイドを書いています。 あなたはそれをチェックアウトすることができます : https://medium.com/@1297rohit/transfer-learning-from-scratch-using-keras-339834b153b9

顔検出と顔認識について一歩一歩学びたい場合は、リンク上のそのトピックに関する私の記事に向かうことができます:https://medium.com/@1297rohit/step-by-step-face-recognition-code-implementation-from-scratch-in-python-cc95fa041120

分類をお楽しみください!

コメントを残す

メールアドレスが公開されることはありません。