小型データセット集積ニューラルネットワークCNN訓練戦略
6401 ワード
小型データセット集積ニューラルネットワークCNN訓練戦略小型モデル を訓練する予め訓練されたネットワークを用いて特徴抽出 を行う.予め訓練されたネットワークを微調整する 多くのシーンでは、私たちは数千個から数百個のサンプルしかありませんが、このようなサンプルを使用するには、cnnネットワークを訓練し、フィッティングを避けるために、いくつかの戦略を採用する必要があります.現在、主に採用されている戦略は主に以下の3つがあります.小型モデル を訓練する予め訓練されたネットワークを用いて特徴抽出 を行う.予め訓練されたネットワークを微調整する 小型の模型を訓練する
このスキームが主に適用されるシーンは,比較的簡単なタスクシーンの場合に用いられ,比較的小さなモデルを設計し,対応する正規化を行い過フィッティングを回避し,データ増強を行いサンプル量を増加させることで,より小さなサンプル数でも良好な結果を得ることができる.
これらの小型化戦略には、以下のものが含まれます.ネットワークの深さを低減する ネットワーク層毎のパラメータ数を低減する .
データ拡張を使用して、サンプルセットを追加することもできます.
事前訓練されたネットワークを用いて特徴抽出を行う
このスキームは,ビッグデータサンプルで訓練されたいくつかのネットワーク構造を新しいサンプルに移行して訓練することである.事前訓練されたネットワークには多くの有用な特徴抽出情報が保存されているため、小サンプル上で有効に価値のある特徴情報を抽出することができる.もちろん、ネットワークの最終タスクタイプの違い、例えば事前訓練されたネットワークは1000種類の分類であり、私たちは二分類に使用するだけであるため、一般的な方法はネットワークのCNN構造、すなわちボリュームプール化層を保持することである.しかし、後続の全接続層(分類層)は再設計と訓練が必要である.
kerasにモデルをインポートしたらinclude_を設定するだけですtopは、全接続分類レイヤを含むかどうかを指定します.
次のようなコードを使用して、新しい全接続分類レイヤを完了します.
なお、プリトレーニングボリューム層は、関連する特徴抽出パラメータ情報を格納しているが、新しい全接続層はランダムに初期化されているため、全ネットワークでトレーニングを行うことはできない.一般的には、ネットワークボリューム層を「凍結」すること、すなわち、プリトレーニングのネットワークパラメータは逆伝播調整されず、新たに加わった全接続および分類層のパラメータのみを調整することである.このようにパラメータ数も小さく,小さなサンプルを用いて良好な訓練結果を得ることができる.
事前に訓練されたネットワークを微調整する
上記の方法と同様に、さらに延長することもできるが、もちろん、図に示すように、最後の層のみを残して訓練することができ、凍結前のすべての層を凍結することもできる.
指定した名前レイヤをフリーズする前のすべてのレイヤを次のコードで表します.
以下の結論は「Python深さ学習」から抜粋し、本文の内容も本の中の内容に対する理解から出ている.ボリュームニューラルネットワークは、コンピュータの視覚タスクに使用される最適な機械学習モデルである.非常に小さなデータセットでも、最初からボリュームニューラルネットワークを訓練することができ、結果は悪くありません. の小型データセットにおける主な問題は、オーバーフィットである.画像データを処理する際、データ増強はオーバーフィットを低減する強力な方法である. は、特徴抽出を用いて、既存のボリュームニューラルネットワークを新しいデータセットに容易に再利用することができる.これは、小型画像データセットにとって価値のある方法です. は、特徴抽出の補足として、微調整を使用して、既存のモデルで以前に学んだいくつかのデータ表現を新しい問題に適用することもできます.この方法はモデル性能をさらに向上させることができる.
このスキームが主に適用されるシーンは,比較的簡単なタスクシーンの場合に用いられ,比較的小さなモデルを設計し,対応する正規化を行い過フィッティングを回避し,データ増強を行いサンプル量を増加させることで,より小さなサンプル数でも良好な結果を得ることができる.
これらの小型化戦略には、以下のものが含まれます.
データ拡張を使用して、サンプルセットを追加することもできます.
datagen = ImageDataGenerator(
rotation_range, # rotation_range ( 0~180 ),
width_shift_range,
height_shift_range, # width_shift height_shift ( )
shear_range, # shear_range
zoom_range, # zoom_range
horizontal_flip, # horizontal_flip
fill_mode ) # fill_mode , /
事前訓練されたネットワークを用いて特徴抽出を行う
このスキームは,ビッグデータサンプルで訓練されたいくつかのネットワーク構造を新しいサンプルに移行して訓練することである.事前訓練されたネットワークには多くの有用な特徴抽出情報が保存されているため、小サンプル上で有効に価値のある特徴情報を抽出することができる.もちろん、ネットワークの最終タスクタイプの違い、例えば事前訓練されたネットワークは1000種類の分類であり、私たちは二分類に使用するだけであるため、一般的な方法はネットワークのCNN構造、すなわちボリュームプール化層を保持することである.しかし、後続の全接続層(分類層)は再設計と訓練が必要である.
kerasにモデルをインポートしたらinclude_を設定するだけですtopは、全接続分類レイヤを含むかどうかを指定します.
from keras.applications import VGG16
conv_base = VGG16(weights='imagenet',
include_top=False,
input_shape=(150, 150, 3))
次のようなコードを使用して、新しい全接続分類レイヤを完了します.
model.add(layers.Dense(256, activation='relu', input_dim=4 * 4 * 512))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
なお、プリトレーニングボリューム層は、関連する特徴抽出パラメータ情報を格納しているが、新しい全接続層はランダムに初期化されているため、全ネットワークでトレーニングを行うことはできない.一般的には、ネットワークボリューム層を「凍結」すること、すなわち、プリトレーニングのネットワークパラメータは逆伝播調整されず、新たに加わった全接続および分類層のパラメータのみを調整することである.このようにパラメータ数も小さく,小さなサンプルを用いて良好な訓練結果を得ることができる.
事前に訓練されたネットワークを微調整する
上記の方法と同様に、さらに延長することもできるが、もちろん、図に示すように、最後の層のみを残して訓練することができ、凍結前のすべての層を凍結することもできる.
指定した名前レイヤをフリーズする前のすべてのレイヤを次のコードで表します.
conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
if layer.name == 'block5_conv1':
set_trainable = True
if set_trainable:
layer.trainable = True
else:
layer.trainable = False
以下の結論は「Python深さ学習」から抜粋し、本文の内容も本の中の内容に対する理解から出ている.