Science2018.5.9ツイートTopicsはじめに実験ファインチューニングのコツについてまとめ参考こんにちは。この記事では、桜とコスモスの写真を分類する機械学習モデルを、転移学習を用いて作成します。はじめに前回の記事では、VGG16をファインチューニングすることで、桜とコスモスの写真を分類する機械学習モデルを作成しました。今回は、学習済みのVGG16を特徴量抽出に使い、SVMと組み合わせることで、桜とコスモスの写真を分類する機械学習モデルを作成します。このような方法を、転移学習といいます。前々回の記事と同じ準備の下で実験をします。IPythonを起動します。ipython3訓練データを読み込みます。random_state=3)VGG16のモデル・パラメータを読み込みます。畳み込み層、プーリング層の出力を特徴量として使用するために、末尾の全結合層は除き、最後に平均値でプーリングします。pooling="avg")訓練データをVGG16に処理させたものを、新しい特徴量とします。base_model.predict(x_test)最後に、線形SVMに訓練データを学習させます。1.0となり、訓練データ、バリデーションデータともに、100%の精度を達成できています。Serviceの性能に追いつくことができました。(VGG16で変換した特徴量を主成分分析にかけ、可視化したもの。桜とコスモスを見分けるための特徴量が抽出できていることが推察できる。)ファインチューニングのコツについてスタンフォード大学の講義資料によると、十分な訓練データを用意することが難しいことが多いため、畳み込みニューラルネットワークをゼロから学習させることは少ないそうです。かわりに用いられるのがこれまで紹介してきたファインチューニングや転移学習といった技法ですが、それにもいくつかのノウハウがあるようです。それを以下で引用・翻訳し紹介します。これはいくつかの因子からの関数ですが、新しいデータセットの大きさ(小さいか大きいか)と、新しいデータセットと元のデータセットの類似度(たとえば、内容と種類がImageNetに似ている画像か、あるいは顕微鏡写真のようであるか)が二つのもっとも重要な因子です。畳み込みニューラルネットワークでは入力側のレイヤーほど一般的な特徴量を出力し出力側のレイヤーほど元のデータセットに特有の特徴量を出力することを考えると、4つの主要な筋書きに対する一般的な指針は以下のようになります。データが小さいので、畳み込みニューラルネットワークをファインチューニングするのは過学習が懸念され、よくありません。データが元のデータに似ているので、畳み込みニューラルネットワークの高次の特徴量が新しいデータセットとの間にも関係していると期待できます。したがって、CNN符号(訳注:畳み込みニューラルネットワークで、最後の層の直前の層から出力される特徴量のこと)を使って線形分類器を訓練するのが最善でしょう。多いデータがあるので、ネットワーク全体をファインチューニングしようとしても過学習しない可能性が高いといえます。データが小さいので、線形分類器を訓練するだけが一番いいでしょう。データセットがぜんぜん違うので、特徴量がデータセット特有のものになっているネットワークの出力側レイヤーから分類器を訓練するのはよくないでしょう。かわりに、SVMをネットワークのもっと入力側のどこかの特徴量を使って訓練するのがよいでしょう。データセットが非常に大きいので、畳み込みニューラルネットワークをゼロから訓練しても大丈夫です。実際には、訓練済みモデルの重みでネットワークを初期化すると有効であることが頻繁にあります。この場合では、ネットワーク全体をファインチューニングするのに十分なデータと自信が持てるでしょう。(拙訳)3回の記事にわたる今回の実験では、ゼロからCNNを学習させたりCNNをファインチューニングするよりも、学習済みCNNから特徴量を抽出し線形識別させたほうが性能がよくなりました。これはいま紹介したノウハウを裏付ける結果となっています。ファインチューニングのコツとしては他にも、Kerasの作者がブログで書いているように、「ランダムに初期化された層を後ろにつけた状態で、学習済みのレイヤーごと学習させようとしない」「RMSPropのような最適化アルゴリズムを使わずに、SGDなどで小さい学習レートで学習させる」などがあるようです。まとめこの記事では、VGG16のモデル・パラメータを使って画像の特徴量を抽出し、SVMで学習することで、ついに100%の精度をもつ桜-コスモス分類器を作成することができました。第1回の記事ではゼロからCNNを学習させて過学習に苦しみ、第2回の記事ではVGG16をファインチューニングすることで過学習をある程度克服しました。Azure#Python#TensorFlow#ニューラルネットワーク#機械学習#画像認識tmtkデータ分析と機械学習とソフトウェア開発をしています。アルゴリズムとデータ構造が好きです。