「CNNによる特徴抽出の探求」

「特徴抽出の探求:CNNの解明」

畳み込みニューラルネットワークを使用して特徴抽出の専門化をチェックする

(左)著者によるVGG19 CNNアーキテクチャを使用したライオンの画像での特徴抽出(右)ライオンの元の画像(Pexelsで利用可能なパブリックドメイン)

畳み込みニューラルネットワークは、機械学習を使用した画像分類のタスクにおける今日の基礎です。しかし、分類の前に行う非常に便利なタスクは、画像から関連する特徴を抽出することです。特徴抽出は、CNNが画像の主要なパターンを認識し、分類するための方法です。本記事では、TensorFlowとKerasの関数APIを使用して特徴抽出を行う方法の例を示します。しかし、これらのCNNの概念を形式化するためには、まずpixel spaceについて話す必要があります。

背景

Pixel space

Pixel spaceは名前の通りです。画像が個々のピクセルに対応する値の行列に変換される空間です。したがって、CNNに供給される元の画像は、数値の行列に変換されます。グレースケール画像では、これらの数値は通常、0(黒)から255(白)までの範囲で、その間の値はグレーシェードです。本記事では、すべての画像を正規化しており、つまり、すべてのピクセルの値を255で割って、値が[0,1]の範囲に収まるようにしています。

CNNとpixel space

CNNがピクセル表現の画像で行うことは、フィルタを適用して処理し、最終的な「決定」としてその画像をクラスに分類するために関連するピクセルを抽出することです。例えば、ページの上の画像では、そのCNNはライオンの口、舌、目(および一般的な強い輪郭)に注目し、これらの特徴はネットワークの深層に進むにつれてさらに抽出されます。したがって、分類に関してCNNが専門化するほど、画像の主要な特徴を認識するプロフェッショナルになると言えます。

目標

これに基づいて、目標はシンプルです。画像の特徴抽出においてCNNの専門化レベルを見ることです。

方法

これを行うために、同じアーキテクチャで2つの畳み込みニューラルネットワークをトレーニングしましたが、トレーニングサイズが異なります。1つは5万枚の画像を使用したもの(これがベンチマークでスマートなもの)、もう1つは1万枚の画像を使用したもの(これがダミーです)。その後、CNNのレイヤーをスライスして、アルゴリズムが画像に対してどのように見え、それをどのように認識するかを確認しました。

データセット

このプロジェクトで使用したデータセットは、よく使用されているcifar10画像データセット[1]です。これは60K枚の画像ベースで、10のクラスに分割されており、そのうち1万枚の画像がホールドアウト検証セットとして使用されます。画像のサイズは32×32ピクセルで、RGBカラーで、つまり3つのカラーチャンネルがあります。

データの漏れを防ぐために、特徴認識においてテスト画像として1つの画像を保持し、トレーニングのどちらでも使用しなかったため、ここに乾杯できるギニアピッグ、カエルを紹介します。

カエル。

TensorFlowでの実装

次のコードスニペットには、実装が示されています。CNNのレイヤーを適切にスライスするには、Sequential APIではなくTensorFlowのKeras functional APIを使用する必要があります。これは、次のレイヤーが前のレイヤーの上に呼び出されるカスケードとして機能します。

import tensorflow as tffrom tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Input, Conv2D, MaxPool2D, Dense, Dropout, Flattenfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStoppingdef get_new_model(input_shape):  ''' この関数は、上記の指定に従ってコンパイルされたCNNを返します。 '''    # CNNのアーキテクチャを定義する  input_layer = Input(shape=input_shape, name='input')  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_1')(input_layer)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_2')(h)  h = MaxPool2D(pool_size=(2,2), name='pool_1')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_3')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_4')(h)  h = MaxPool2D(pool_size=(2,2), name='pool_2')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_5')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_6')(h)      h = Dense(64, activation='relu', name='dense_1')(h)  h = Dropout(0.5, name='dropout_1')(h)  h = Flatten(name='flatten_1')(h)  output_layer = Dense(10, activation='softmax', name='dense_2')(h)  # モデルを生成するために、入力層と出力層を渡す  model = Model(inputs=input_layer, outputs=output_layer, name='model_CNN')  # 次に、compileメソッドを適用する  model.compile(optimizer='adam',                loss='categorical_crossentropy',                metrics=['accuracy'])    return model

アーキテクチャの仕様は、図1に示されています。

図1:使用されているCNNの要約。 画像は著者によるものです。

使用される最適化手法はAdamであり、損失関数はカテゴリカルクロスエントロピーであり、評価に使用されるメトリックはデータセットが完全にバランスしているため、正確性だけです。

CNNのスライス

これで、2つのCNNの戦略的なレイヤーのいくつかをスライスして、画像の処理レベルをチェックすることができます。以下にコードの実装が示されています:

benchmark_layers = model_benchmark.layersbenchmark_input = model_benchmark.inputlayer_outputs_benchmark = [layer.output for layer in benchmark_layers]features_benchmark = Model(inputs=benchmark_input, outputs=layer_outputs_benchmark)

ここで起こっていることは次のとおりです。最初の行はモデルの各レイヤーにアクセスし、2行目は全体のCNNの入力レイヤーを返します。その後、3行目では各レイヤーの出力を示すリストを作成し、最後に出力がレイヤーの出力である新しいモデルを作成します。これにより、レイヤー間で何が起こっているかを確認できます。

ダミーモデルのレイヤーにアクセスするために非常に似たコードが書かれているため、ここでは省略します。では、異なるレイヤーで処理されたカエルの画像を見てみましょう。

最初の畳み込み層

ダミー

図2は、畳み込み層(conv2d_1)の16つのフィルターの画像を示しています。画像が非常に処理されておらず、冗長な部分が多いことがわかります。これは最初の畳み込み層だけであることを考慮し、処理が重くないことを示しています。これを解決するために、ベンチマークの最初の層を見てみましょう。

Fig. 2: ダミー分類器の最初の畳み込み層。著者による画像。

ベンチマーク

ベンチマーク分類器は、これらの画像のほとんどがもはや識別できない程度まで、より処理された画像を示しています。念のために言っておきますが、これは最初の畳み込み層のみです。

Fig. 3: ベンチマーク分類器の最初の畳み込み層。著者による画像。

最後の畳み込み層

ダミー

予想通り、画像はもはや識別できません。これまでに6つの畳み込み層と2つのプーリング層を通過したため、画像のサイズが小さくなっていることが説明されます。ベンチマークの最後の層はどのようになっているか見てみましょう。

Fig. 4: ダミー分類器の最後の畳み込み層。著者による画像。

ベンチマーク

これはさらに処理が行われ、画像のほとんどのピクセルが黒になっていることを示しています。これは、重要な特徴が選択され、画像の残りが基本的に破棄されたことを示しています。

Fig. 5: ベンチマーク分類器の最後の畳み込み層。著者による画像。

これが情報と関連する方法

同じネットワークの同じスライスに対して処理の程度が非常に異なることがわかります。定性的な分析から、ベンチマークモデルは入力から有用な情報をより攻撃的に抽出する傾向があることが明らかです。特に最初の畳み込み層の比較では、ダミーモデルよりもカエルの画像の出力は歪みが少なく、より識別可能です。

図6では、ベンチマークモデルのピクセル(青色)がゼロに対してより圧縮され、ダミーモデルのピクセル(赤色)は色の分布がより長いテールを示していることがわかります。

Fig. 6: 最後の層のピクセルの確率分布。ベンチマークのピクセル(青色)はゼロに対してより圧縮され、ダミーモデルのピクセル(赤色)はより長いテールを示しています。

元のカエルの画像のピクセル分布を見ると、図7に示されており、より対称的な分布で、おおよそ0.4を中心としています。

Fig. 7: 元のカエルの画像の色分布。著者による画像。

情報理論の観点から見ると、畳み込み層を通過した後の結果画像とオリジナル画像の確率分布の違いは、膨大な情報の獲得を表しています。

図6を見て図7と比較すると、前者ではどのピクセルが見つかるかについて非常に確信を持っていますが、後者ではそれほど確信がありません。したがって、情報の獲得があります。これは情報理論の非常に簡単で質的な探索であり、広範な領域への入り口を開きます。詳細については、この投稿をご覧ください。

さらに、分類器の回答の不確実性を見る一つの方法は、クラスに対する確率分布を見ることです。これは、CNNの最後にあるソフトマックス関数の出力です。図8(左)は、ベンチマークがクラスについて非常に確信を持っていることを示しており、分布がカエルのクラスにピークを持っています。一方、図8(右)は、最も高い確率が間違ったクラスにある混乱したダミー分類器を示しています。

図8:各分類器が割り当てた確率分布。著者による画像。

この解析は予想された結果を示しており、トレーニングセットが大きいほど、特徴抽出アルゴリズムがより良くなります。

このプロジェクトのノートブックはこちらで利用できます。

参考文献

[1] Krizhevsky, Alex, and Geoffrey Hinton. 小さな画像から複数の特徴を学習する方法。(2009):7。

[2] M. Jogin, et al.、畳み込みニューラルネットワーク(CNN)とディープラーニングを使用した特徴抽出(2018)、IEEE Electronics、Information & Communication Technology (RTEICT)での国際会議

[3] K. Simonyan, A. Zisserman、大規模画像認識のための深層畳み込みネットワーク(2015)、ICLR 2015における会議論文として発表されました

[4] Z. Matthew and F. Rob. 畳み込みネットワークの視覚化と理解(2013)、ヨーロッパコンピュータビジョン会議

[5] B. Jyostna and N. Veeranjaneyulu、ディープ畳み込みニューラルネットワークを使用した特徴抽出とクラス分類(2018)、ジャーナル of Cyber Security and Mobility

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more