GradCamを使用して畳み込みニューラルネットワークを復号化します

概要概要

畳み込みニューラルネットワーク(CNN)およびその他の深層学習ネットワークは、画像分類からオブジェクト検出、セマンティックセグメンテーション、画像キャプション、最近の視覚的な質問応答まで、さまざまなコンピュータービジョンタスクで前例のないブレークスルーを達成しました。これらのネットワークは優れたパフォーマンスを発揮しますが、直感的で理解しやすいコンポーネントに分解する機能がないため、説明するのは困難です。したがって、今日のスマートシステムに障害が発生すると、警告や説明なしに異常に障害が発生し、ユーザーは一貫性のない出力を見つめ、その理由を疑問視することになります。

ディープラーニングモデルの解釈可能性は、信頼を構築し、それを私たちの日常生活にうまく統合するために不可欠です。この目標を達成するために、モデルの透明性は、予測内容を予測する理由を説明するのに役立ちます。

大まかに言えば、この透明性は、人工知能(AI)の進化の3つの段階で役立ちます。

  • まず、人工知能が比較的弱く、確実に「展開」できない場合、透明性と解釈の目標は、障害モードを特定することです。

  • 第二に、人工知能が人間に匹敵し、確実に「展開可能」である場合、目標はユーザー間の適切な信頼と信頼を構築することです。

  • 第三に、人工知能が人間よりもはるかに強力である場合、説明の目標は機械教育、つまり人間により良い意思決定を行う方法を教えることです。

前回の記事では、畳み込みニューラルネットワークの解釈可能性の問題について説明し、問題をある程度解決するために使用される非常に人気のある手法、つまりクラスアクティベーションマップ(クラスアクティベーションマップ)またはCAMについて説明しました。この問題。CAMは、CNNの作業をわかりやすく説明し、開発されたアプリケーションに対する顧客の信頼を築くことができる優れたテクノロジーですが、いくつかの制限があります。CAMの欠点の1つは、機能マップをsoftmaxレイヤーの直前に配置する必要があることです。そのため、特定のCNNアーキテクチャに適しています。つまり、予測の直前に畳み込みマップでグローバル平均プールを実行します。(つまり、conv機能はグローバル平均プーリングソフトマックス層をマップします)。このアーキテクチャは、一部のタスクで一般的なネットワークよりも精度が低い場合や、新しいタスクにまったく適していない場合があります。

この記事では、CAMの一般化、いわゆる勾配CAMについて説明します。「Grad-cam」は2017年に公開されました。これは、CAMの欠点を改善することを目的としており、あらゆるタイプのアーキテクチャと互換性があると主張しています。このテクノロジーは、既存のモデルアーキテクチャを変更する必要がないため、画像のキャプションや視覚的な質問応答のアーキテクチャなど、CNNベースのアーキテクチャに適用できます。完全な畳み込みアーキテクチャの場合、grad-camはCAMに縮小されます。

方法

以前のいくつかの研究では、CNNのより深いパフォーマンスが最高の高レベル構造をキャプチャすると主張しています。さらに、CNNは完全に接続されたレイヤーで失われた空間情報を自然に再トレーニングするため、最終的な畳み込みレイヤーは、高レベルのセマンティクスと詳細な空間情報の間で最良のトレードオフを持つことが期待できます。

Gradcamは、CNNの最後の畳み込み層に流入する勾配情報を使用して各ニューロンを理解し、興味深い決定を行うという点でCAMとは異なります。任意のcタイプの幅uと高さvのクラス識別ポジショニングマップを取得するために、まず、畳み込み層の特徴マップAkのcタイプyc(softmaxの前)のスコア勾配を計算します。これらのリフローの勾配は、ニューロンのターゲットクラスの重要な重みakを取得するためのグローバル平均プールです。

ここに画像の説明を挿入
ターゲットクラスcのakを計算した後、加重アクティベーションマッピングの組み合わせを実行し、そのReLUに従います。
ここに画像の説明を挿入
これにより、畳み込み特徴マップと同じサイズの大まかなヒートマップが生成されます。関心のあるクラスにプラスの影響を与える機能のみに関心があるため、線形結合にReLUを適用します。ReLUがない場合、クラスアクティベーションマッピングはより多くのコンテンツを強調するため、ポジショニングのパフォーマンスが低下します。

次の図は、この重要な概念をより明確に理解するための、各コンピュータービジョンタスクの完全なフローを示しています。
ここに画像の説明を挿入

実装プロセス

  1. まず、前進作戦を実行するためのモデルが必要です。Imagenetでは事前トレーニング済みのVGG16を使用しています。GradCamはCAMのような特定のアーキテクチャを必要とせず、畳み込みニューラルネットワークと互換性があるため、任意のモデルを使用できます。
model = VGG16(weights='imagenet')
  1. モデルを定義した後、サンプル画像をロードして前処理し、モデルと互換性を持たせます。
def preprocess(img):
    img = img_to_array(img)
    img = np.expand_dims(img,axis=0)
    img = preprocess_input(img)
    return img
image_1 = preprocess(image)

ここに画像の説明を挿入

  1. 次に、モデルを使用してサンプル画像を予測し、最初の3つの予測をデコードします。下の図でわかるように、モデルの最初の3つの予測のみを考慮し、最上位のモデル予測はボクサーです。
predict = model.predict(image_1)
print(decode_predictions(predict,top=3))
target_class = np.argmax(predict[0])
print("Target Class = %d"%target_class)

ここに画像の説明を挿入

  1. 次に、最後の畳み込み層の特徴マップAkに対するターゲットクラススコアycの勾配を見つけます。ターゲットクラスに対する各チャネルの重要性を直感的に教えてくれます。可変勾配はテンソルを返します。これは次のステップで使用されます。
last_conv = model.get_layer('block5_conv3')
grads = K.gradients(model.output[:,242],last_conv.output)[0]
  1. 次に、得られた勾配をグローバル平均プールにかけ、図1に示すように、ターゲットクラスに対応する重要なニューロンの重みakを取得します。これにより、Keras関数に渡されるテンソルが返されます。このテンソルは、画像を入力として受け取り、pooled_gradientと最後の畳み込み層からのアクティベーションマップを返します。

pooled_grads = K.mean(grads,axis=(0,1,2))
iterate = K.function([model.input],[pooled_grads,last_conv.output[0]])
pooled_grads_value,conv_layer_output = iterate([image_1])
  1. その後、各アクティベーションマップに対応するブレンド勾配を掛け、これらの勾配を重みとして使用して、ターゲットクラスに対する各チャネルの重要性を判断します。次に、チャネル上のすべてのアクティベーションマップの平均を取り、最終的なクラス識別顕著性マップを取得します。

for i in range(512):
    conv_layer_output[:,:,i] *= pooled_grads_value[i]
heatmap = np.mean(conv_layer_output,axis=-1)

ここに画像の説明を挿入

  1. 次に、生成されたヒートマップにReLUを適用して、出力ヒートマップにプラスの影響を与える特徴のみを保持します。ただし、ヒートマップには負の強度があまりないことがわかります。したがって、ReLUを適用した後のヒートマップにはあまり変化がありません。
for x in range(heatmap.shape[0]):
    for y in range(heatmap.shape[1]):
        heatmap[x,y] = np.max(heatmap[x,y],0)

ここに画像の説明を挿入

  1. 次に、ヒートマップを正規化してすべての値が0〜1になるように、ヒートマップの各強度値を最大強度値から分離します。

heatmap = np.maximum(heatmap,0)
heatmap /= np.max(heatmap)
plt.imshow(heatmap)

ここに画像の説明を挿入

  1. 最後に、取得したヒートマップをアップサンプリングして入力画像のサイズに一致させ、入力画像にオーバーレイして結果を確認します。
upsample = resize(heatmap, (224,224),preserve_range=True)
plt.imshow(image)
plt.imshow(upsample,alpha=0.5)
plt.show()

ここに画像の説明を挿入

結論として

この記事では、特に画像関連のタスクに適した最先端のアーキテクチャである畳み込みニューラルネットワークを説明するための新しい手法を学びました。Grad Camは、その前身であるCamを改善し、より良いポジショニングと明確なクラス差顕著性マップを提供します。これにより、ブラックボックスのようなモデルの背後にある複雑さを明らかにすることができます。解釈可能な機械学習の分野での研究はより速い速度で発展しており、これは顧客の信頼を構築し、モデルの改善を支援するために重要です。

おすすめ

転載: blog.csdn.net/weixin_42990464/article/details/113502779