主要内容

。

クラス活性化マッピングを使用したネットワークの予测の调查

この例では,クラス活性化マッピング(CAM)を使用して,深层畳み込みニューラルネットワークによるイメージ分类の予测を调查し说明する方法を示します。

深层学习ネットワークは,ネットワークに何を学习させ,ネットワークへの入力のどの部分がネットワークの予测の要因になったかを理解する方法が提供されないため “ブラックボックス” のように考えられることがよくあります。多くの场合,モデルが失败して误った予测が与えられても,警告や说明は一切なく完了します。クラス活性化マッピング[1]は,畳み込みニューラルネットワークの予测についての视覚的な说明を取得するために使用できる手法の1つです。误っていて妥当でないように见える予测でも,相応の理由がある可能性があります。クラス活性化マッピングを使用すると,入力イメージの特定の部分がネットワークを“混乱” させ,误った予测を行う原因になっていないかどうかを确认できます。

クラス活性化マッピングを使用して学习セットのバイアスを识别し,モデルの精度を向上させることが可能です。ネットワークが误った特徴を基に予测しているとわかった场合は,より适切なデータを收集してネットワークをさらにロバストにすることができます。たとえば,猫と犬のイメージを区别するようにネットワークに学习させると仮定します。ネットワークは学习セットに対しては高精度ですが,実世界の例に対しては性能が劣ります。学习の例にクラス活性化マッピングを使用することで,ネットワークがイメージ内の犬や猫ではなく,背景を基に予测していることがわかりました。次に,猫の写真は背景がすべて赤く,犬の写真は背景がすべて绿であり,学习中に背景の色をネットワークに学习させてしまったことに気付きます。そのため,このバイアスをもたない新しいデータを收集することができます。

この例のクラス活性化マップでは,入力イメージのどの领域が予测クラスに最も寄与しているかがわかります。赤い领域が最も寄与しています。

事前学习済みのネットワークと网络カメラの読み込み

イメージ分类用に事前学习済みの畳み込みニューラルネットワークを読み込みます.SqueezeNet,GoogLeNet,RESNET-18,およびMobileNet-V2は比较的高速なネットワークです.SqueezeNetは最も高速なネットワークで,クラス活性化マッピングの解像度は他のネットワークの4倍です.AlexNet,VGG-16,およびVGG-19のようにネットワークの最后に复数の全结合层をもつネットワークでは,クラス活性化マッピングを使用できません。

网络名=“squeezenet”;净= EVAL(NETNAME);

摄像头オブジェクトを作成して网络カメラに接続します。

相机=摄像头;

イメージの入力サイズとネットワークの出力クラスを抽出します。この例の终わりに定义されている补助关数activationLayerNameは,活性化を抽出する层の名前を返します。この层はネットワークの最后の畳み込み层に続くRELU层です。

inputSize = net.Layers(1).InputSize(1:2);类= net.Layers(结束).Classes;layerName = activationLayerName(NETNAME);

クラス活性化マッピングの表示

图を作成してループでクラス活性化マッピングを実行します。ループの実行を终了するには,图を闭じます。

H =系数('单位'“规范化”'位置',[0.05 0.05 0.9 0.8],'可见的''在');尽管ishandle(H)

网络カメラを使用してスナップショットを取得します。イメージをサイズ変更して短辺の长さ(ここではイメージの高さ)をネットワークの入力イメージサイズと等しくします。サイズを変更する际,イメージの縦横比を维持します。イメージのサイズは拡大したり缩小したりできます。イメージを拡大すると最终的なクラス活性化マップの解像度が上がりますが,予测全体の精度が下がる原因になる可能性があります。

ネットワークの最后の畳み込み层に続くRELU层で,サイズ変更されたイメージの活性化を计算します。

IM =快照(照相机);imResized = imresize(1M,[inputSize(1),NaN的]);imageActivations =激活(净,imResized,layerName);

特定クラスのクラス活性化マップは,最终の畳み込み层に続くRELU层の活性化マップで,各活性化がクラスの最终的なスコアにどれだけ寄与するかに応じて重み付けされます。これらの重みは,そのクラスにおけるネットワークの最终全结合层の重みに等しくなります.SqueezeNetには最终の全结合层がありません。代わりに,最后の畳み込み层に続くRELU层の出力は,既にクラス活性化マップになっています。

クラス活性化マップはどのような出力クラスに対しても生成できます。たとえば,ネットワークが误って分类した场合,真のクラスと予测クラスのクラス活性化マップを比较できます。この例では,スコアが最も高い予测クラスのクラス活性化マップを生成します。

分数=挤压(平均值(imageActivations,[1 2]));如果网络名〜=“squeezenet”fcWeights = net.Layers(端-2).Weights;fcBias = net.Layers(端-2).Bias;分数= fcWeights *得分+ fcBias;[〜,ClassID的] = maxk(得分,3);weightVector = shiftdim(fcWeights(ClassID的(1),:), -  1);classActivationMap =总和(imageActivations * weightVector,3);别的[〜,ClassID的] = maxk(得分,3);classActivationMap = imageActivations(:,:,ClassID的(1));结尾

最上位クラスのラベルと最终的な正规化されたクラススコアを计算します。

分数= EXP(得分)/ SUM(EXP(分数));maxScores =分数(ClassID的);标签=类(ClassID的);

クラス活性化マップをプロットします。最初のサブプロットに元のイメージを表示します0.2番目のサブプロットに,この例の终わりに定义されている补助关数CAMshowを使用して,元のイメージのグレースケールバージョンを暗くしてその上にクラス活性化マップを重ねて表示します。上位3つの予测ラベルを予测スコアと共に表示します。

副区(1,2,1)imshow(IM)副区(1,2,2)CAMshow(1M,classActivationMap)标题(字符串(标签)+“,”+串(maxScores));drawn结尾

摄像头オブジェクトをクリアします。

清除相机

マップの例

ネットワークはイメージ内のオブジェクトをローファー(靴の一种)として正しく识别しています。右のイメージのクラス活性化マップは,入力イメージの各领域による,予测クラス浪子への寄与を示しています。赤い领域が最も寄与しています。ネットワークは靴全体を基に分类を行いますが,最も强い入力は赤い领域,つまり靴のつま先と履き口から得られます。

ネットワークは以下のイメージをマウスとして分类します。クラス活性化マップからわかるように,予测はイメージ内のマウスだけでなく,キーボードにも基づいています。学习セットにはキーボードの邻にマウスがあるイメージが多く含まれる倾向にあるため,キーボードを含むイメージはマウスを含む倾向にあることがネットワークにより予测されます。

ネットワークは,以下のコーヒーカップのイメージをバックルとして分类します。クラス活性化マップからわかるように,イメージであまりに多くのオブジェクトが重なっているため,ネットワークがイメージを误分类します。ネットワークは,コーヒーカップではなく腕时计のリストバンドを検出して,これに焦点を当てています。

补助关数

CAMshow(IM,CAM)は,イメージ我是のグレースケールバージョンを暗くしたものに,クラス活性化マップcamを重ね合わせます。この关数はクラス活性化マップを我是のサイズに変更し,正规化し,下からしきい値处理を行って,喷射カラーマップを使用して可视化します。

功能CAMshow(1M,CAM)imSize =尺寸(IM);CAM = imresize(CAM,imSize(1:2));CAM = normalizeImage(CAM);CAM(CAM <0.2)= 0;CMAP =射流(255)* linspace(0,1,255)。';CAM = ind2rgb(UINT8(CAM * 255),CMAP)* 255;combinedImage =双(rgb2gray(IM))/ 2 + CAM;combinedImage = normalizeImage(combinedImage)* 255;imshow(UINT8(combinedImage));结尾功能N = normalizeImage(I)最小= MIN(I(:));最大= MAX(I(:));N =(I  - 最小)/(最大 - 最小);结尾功能layerName = activationLayerName(NETNAME)如果网络名==“squeezenet”layerName ='relu_conv10';eleesif.网络名==“googlenet”layerName =“inception_5b输出”;eleesif.网络名==“resnet18”layerName ='res5b_relu';eleesif.网络名==“mobilenetv2”layerName ='out_relu';结尾结尾

参照

[1]周,博雷,阿迪亚斯拉,阿形Lapedriza,奥德奥利瓦,和Antonio托拉尔瓦。“学习的区别定位深的特点。”在计算机愿景和模式识别的IEEE会议的诉讼程序,第2921至2929年。2016年。

参考

|

关键词トピック