このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,データセットを使用して何が深層ニューラルネットワークのチャネルを活性化するか発見する方法を説明します。これにより,ニューラルネットワークの仕組みを理解すると共に,学習データセットの潜在的な問題を診断することができます。
この例では,食品のデータセットを転移学習させたGoogLeNetを使用して,いくつかのシンプルな可視化手法を取り上げます。
分类器を最大あるいは最小に活性化させるイメージを确认することにより,さまざまなイメージクラスのクラススコアに基づくシンプルな手法を使用して,ニューラルネットワークが误った分类をする理由を诊断する方法を学习します。
データの読み込みと前処理
イメージイメージイメージデータストア読み込みますます読み込みさいさいデータセットにははは计计计计とと计计いいいいいいい计い计计いい计いいい计计いいい
このデータを学习セット,検证セット,およびテストセットに分割してGoogLeNetの転移学习の准备をします。データセットの写真を数枚表示します。
RNG默认的DATADIR =完整文件(TEMPDIR,“食品数据集”);URL =“//www.tatmou.com/金宝appsupportfiles/nnet/data/ExampleFoodImageDataset.zip”;如果~存在(dataDir“dir”mkdir (dataDir);结束downloadExampleFoodImagesData (url, dataDir);
下载MathWorks的实例菜品图像数据集...这可能需要几分钟的时间下载...下载完成......解链文件...解链完成...已完成。
imd = imageDatastore (dataDir,...“IncludeSubfolders”,真实,“LabelSource”那“foldernames”);[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(IMDS,0.6,0.2);RND = randperm(numel(imds.Files),9);对于i = 1:numel(rnd) subplot(3,3,i) imshow(imread(imds.Files{rnd(i)})) label = imds.Labels(rnd(i));标题(标签,“翻译”那“无”)结束
食品イメージを分类するネットワークの学习
事前学習済みのGoogLeNetネットワークを使用して,9クラスの食品を分類するよう再学習させます。深度学习工具箱™模型对于GoogLeNet网络サポートパッケージをインストールしてないない场合书,ダウンロード用リンクが表示されます。
别の事前学习済みのネットワークを试すには,この例をMATLAB®で开き,googlenet
より高速なネットワークであるsqueezenet
のような别のネットワークを选択します。使用可能なすべてのネットワークについては,事前学習済みのネットワークの読み込みを参照してください。
网= googlenet;
ネットワークの层
プロパティの最初の要素はイメージ入力层です。この层にはサイズが224 X 224×3の入力イメージが必要です。ここで,3はカラーチャネルの数です。
inputSize = net.Layers(1).InputSize;
ネットワークの畳み込み層は,入力イメージを分類するために,最後の学習可能な層と最終分類層が使用するイメージの特徴を抽出します。GoogLeNetのこれらの2つの層“loss3-classifier”
および'输出'
は,ネットワークによって抽出された特徴を組み合わせてクラス確率,損失値,および予測ラベルにまとめる方法に関する情報を含んでいます。新しいイメージを分類するために事前学習済みのネットワークを再学習させるには,これら2つの層を新しいデータセットに適応させた新しい層に置き換えます。
学習済みのネットワークから層グラフを抽出します。
lgraph = layerGraph(净);
ほとんどのネットワークでは,学习可能な重みを持つ最后の层は全结合层です。この全结合层を,新しいデータセットのクラスの数(この例では9)と同じ数の出力をもつ新しい全结合层に置き换えます。
numClasses =元素个数(类别(imdsTrain.Labels));newfclayer = fullyConnectedLayer (numClasses,...'名字'那'new_fc'那...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraph = replaceLayer(lgraph, net.Layers(end-2))。名字,newfclayer);
分類層はネットワークの出力クラスを指定します。分類層をクラスラベルがない新しい分類層に置き換えます。Trainnetwork.
は,学习时に层ののクラスクラス自动的にししますますますますしますししし
newclasslayer = classificationLayer('名字'那“new_classoutput”);lgraph = replaceLayer(lgraph,net.Layers(端部).name和newclasslayer);
ネットワークの学习
ネットワークにはサイズが224 x 224 x 3の入力イメージが必要ですが,イメージデータストアにあるイメージのサイズは異なります。拡張イメージデータストアを使用して学習イメージのサイズを自動的に変更します。学習イメージに対して実行する追加の拡張演算として,学習イメージを縦軸に沿ってランダムに反転させる演算や,水平方向および垂直方向に最大30ピクセルだけランダムに平行移動させて最大10%スケールアップする演算を指定します。データ拡張は,ネットワークで過適合が発生したり,学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。
pixelRange = [-30 30];scaleRange = [0.9 1.1]。imageAugmenter = imageDataAugmenter(...'randxreflection',真的,...“RandXTranslation”pixelRange,...'RandYTranslation'pixelRange,...'RandXScale'scaleRange,...“RandYScale”,scaleRange);augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain,...'DataAugmentation',imageAugmenter);
他のデータ拡張を実行せずに検証イメージのサイズを自動的に変更するには,追加の前処理演算を指定せずに拡張イメージデータストアを使用します。
augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);
学習オプションを指定します。InitialLearnRate
を小さい値に设定して,まだ冻结されていない転移层での学习速度を下げます。上记の手顺では,最后の学习可能な层の学习率系数を大きくして,新しい最后の层での学习时间を短缩しています。この学习率设定の组み合わせによって,新しい层では高速に学习が行われ,中间层では学习速度が低下し,冻结された初期の层では学习が行われません。
学习するエポック数を指定します。転移学习の実行时には,同じエポック数の学习を行う必要はありません。エポックとは,学习データセット全体の完全な学习サイクルのことです。ミニバッチのサイズと検证データを指定します。エポックごとに1回,検定精度を计算します。
miniBatchSize = 10;valFrequency =地板(numel(augimdsTrain.Files)/ miniBatchSize);选项= trainingOptions(“个”那...“MiniBatchSize”miniBatchSize,...“MaxEpochs”,6,...'InitialLearnRate',3E-4,...“洗牌”那“every-epoch”那...'ValidationData'augimdsValidation,...“ValidationFrequency”,valFrequency,...“详细”,假的,...“情节”那“训练进步”);
学习データを使使をてに习习ささせせせせせせせははははははははははははははははははははははははははなは能能能なななあるあるあるあるあるある场场Trainnetwork.
はGPUを使用します。并行计算工具箱™,これにはおよび以3.0计算能力上のCUDA®対応GPUが必要です。そうでない場合,Trainnetwork.
はCPUを使用します。培训选项
の名前と値のペアの引数“执行环境”
を使用して,実行環境を指定することもできます。このデータセットは小さいため,学習は短時間で終了します。実際にこの例を実行してネットワークに学習させた場合,学習過程に含まれるランダム性のため,異なる結果が得られ誤分類をする可能性があります。
网= trainNetwork (augimdsTrain、lgraph选项);
テストイメージの分类
微調整したネットワークを使用してテストイメージを分類し,分類精度を計算します。
augimdsTest = augmentedImageDatastore(inputSize(1:2), imdsTest);[predictedClasses, predictedScores] = classification (net, augimdsTest);(predictedClasses == imdsTest.Labels)
精度= 0.8622
テストセットの予测の混同行列をプロットします。これは,ネットワークで最も问题の原因になっているクラスを强调表示します。
图;confusionchart (imdsTest。标签,predictedClasses,“归一化”那“row-normalized”);
混同行列,多元のの合,グリークサラダ,刺身,寿司といっいくつかのクラスをがてかしているを示します。これがが生物由をより示しがする。てテストテスト数码行行し,この例で使使するでは,それらのクラスがよりより少ないを念头に置く置く必要ありありありありあり
图();直方图(imdsValidation.Labels);甘氨胆酸ax = ();ax.XAxis.TickLabelInterpreter =“无”;
最も寿司らしい寿司
最初に,ネットワークの寿司クラスを最も強く活性化する寿司のイメージを探します。これは”ネットワークはどのイメージを最も寿司らしいと考えるか”という質問の答えになります。
これを行うには,最大に活性化するイメージ,あるいは全结合层の “寿司” ニューロンを强く活性化する入力イメージをプロットします。次の图は上位4つのイメージをクラススコアの降顺に示しています。
chosenClass =“寿司”;classIdx =找到(net.Layers(结束).Classes == chosenClass);numImgsToShow = 4;[sortedScores, imgIdx] = findMaxActivatingImages(imdsTest, chosenClass, predictedScores, numImgsToShow);图plotImages(imdsTest,imgIdx,sortedScores,predictedClasses,numImgsToShow)
寿司クラスの手がかりの可視化
ネットワークは寿司について正しい部分に着目しているでしょうか。ネットワークの寿司クラスで最大に活性化されたイメージは、相互に類似しており、多くの円形のものが互いに密集しています。
ネットワークはこのような種類の寿司を上手く分類しています。しかし,これが正しいことを検証し,ネットワークの判定理由をより正確に理解するには,Grad-CAMのような可視化手法を使用します。Grad-CAMの使用の詳細については,毕业生-CAMでの深层学习による判定の理由の解明を参照してください。
Grad-CAMを使用するには,GoogLeNetネットワークからdlnetwork
を作成します。ソフトマックス層の名前“概率”
を指定します。最終畳み込み層の名前“inception_5b-output”
を指定します。
lgraph = layerGraph(净);lgraph = removeLayers(lgraph, lgraph. layers (end).Name);dlnet = dlnetwork (lgraph);softmaxName =“概率”;convLayerName =“inception_5b-output”;
拡张イメージデータストアから最初のサイズ変更されたイメージを読み取り,梯度-CAMによる可视化をプロットします。
图像NUMBER = 1;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);sgtitle(字符串(标签)+”(分数:+马克斯(分数)+“)”)
プロットにより,ネットワークは皿やテーブルではなく寿司に正しく焦点を当てていることを確認できます。ネットワークは,このイメージを寿司の集まりとして認識するため,寿司として分類します。ただし,単独で1つの寿司を分類できるでしょうか。
2番目のイメージでは,寿司の集まりが左侧に,単独の寿司が右侧にあります。ネットワークが何に焦点を合てるかを确认するには,2-番目のイメージを読み取って梯度-CAMをプロットします。
imageNumber = 2;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);α= 0.5;图plotGradCAM(img, gradcamMap, alpha);sgtitle(字符串(标签)+”(分数:+马克斯(分数)+“)”)
ネットワークは,複数の寿司がまとまった部分を寿司クラスと関連付けています。これをテストするには,寿司が1つだけある写真を見てみます。
img = imread (strcat (tempdir,“食品数据集/寿司/ sushi_18.jpg”));IMG = imresize(IMG,net.Layers(1).InputSize(1:2),“方法”那“双线性”那“反锯齿”,真正的);[label,score] =分类(net, img);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);sgtitle(字符串(标签)+”(分数:+马克斯(分数)+“)”)
ネットワークは単独の寿司を正確に分類できています。しかし,ネットワークは寿司全体よりも,寿司の中のキュウリの集合にさらに強く焦点を当てていることがGradCAMからわかります。
Grad-CAMの可視化手法を,小さな材料の集まりを含まない単独の寿司に対して実行します。
img = imread (“crop__sushi34-copy.jpg”);IMG = imresize(IMG,net.Layers(1).InputSize(1:2),“方法”那“双线性”那“反锯齿”,真正的);[label,score] =分类(net, img);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+”(分数:+马克斯(分数)+“)”)
この场合,可视化手法によって,ネットワークの性能が劣る理由が明らかになります。寿司のイメージをハンバーガーとして误って分类しています。
この問題を解決するには,ネットワークの学習過程でさらに多くの単独の寿司のイメージを提供する必要があります。
最も寿司らしくない寿司
今度は,寿司クラスについてネットワークを最も活性化しない寿司のイメージを探します。これは, “ネットワークはどのイメージを最も寿司らしくないと考えるか” という质问の答えになります。
ネットワークの性能が劣るイメージを見つけ,その判定に関する洞察が得られるため,これは有用です。
chosenClass =“寿司”;numImgsToShow = 9;[sortedScores,imgIdx] = findMinActivatingImages(imdsTest,chosenClass,predictedScores,numImgsToShow);图plotImages(imdsTest,imgIdx,sortedScores,predictedClasses,numImgsToShow)
刺身に誤分類された寿司の調査
なぜネットワークは寿司を刺身として分类するのでしょうか。ネットワークは,9つのイメージのうち,イメージ2,4,9の3つを刺身として分类しています。このうちイメージ4と9の2つには実际に刺身が含まれています。したがって,実はネットワークが误分类したわけではないことを意味します。これらのイメージには误ったラベルが付いています。
ネットワークが何に焦点を当てているかを确认するには,これらのイメージの1つに対して梯度-CAM手法を実行します。
imageNumber = 2;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+(寿司评分:)+马克斯(分数)+“)”)
予想どおり,ネットワークはは司ではなくではなく刺身に焦点を当てていい
ピザにに分类され寿司の调查
なぜネットワークは寿司をピザに分类したのでしょうか。ネットワークは,9つのイメージのうち4つを寿司ではなくピザとして分类しています。これらのイメージには多くのカラフルなトッピングがあります。
ネットワークがイメージのどの部分を見ているかを確認するには,これらのイメージの1つに対してGrad-CAM手法を実行します。
imageNumber = 5;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+(寿司评分:)+马克斯(分数)+“)”)
ネットワークはトッピングに強く焦点を当てています。
ネットワークがピザとトッピングのある寿司を区别できるようにするには,トッピングのある寿司の学习イメージをさらに追加します。
フライドポテトに誤分類された寿司の調査
なぜネットワークは寿司をフレンチフライに分类したのでしょうか。ネットワークは,7番目のイメージを寿司ではなくフライドポテトとして分类しています。この寿司は黄色で,ネットワークはこの色をフライドポテトと关连付けている可能性があります。
このイメージに対して梯度-CAMを実行します。
imageNumber = 7;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+(寿司评分:)+马克斯(分数)+“)”那“翻译”那“无”)
ネットワークは黄色い寿司に焦点を当て,それをフライドポテトとして分類しています。
この场合にネットワークを改善するには,フライドポテト以外の黄色い食品のイメージを追加して学习させます。
最も刺身らしいものと最も刺身らしくないもの
食品データセットには刺身の観測値は8つしか含まれません。
寿司クラスと同様に,刺身のイメージを最も刺身らしいものから最も刺身らしくないものへと顺に并べて表示します。
chosenClass =“生鱼片”;numImgsToShow = 8;[sortedScores, imgIdx] = findMaxActivatingImages(imdsTest, chosenClass, predictedScores, numImgsToShow);图plotImages(imdsTest,imgIdx,sortedScores,predictedClasses,numImgsToShow)
この图から,青叶のような他の食品を含む刺身に対して,ネットワークによる分类の信頼度が低いことがわかります。ただし,5番目のイメージのように,グラウンドトゥルースとして寿司の写真に误って刺身としてラベル付けされる不备がデータにあることもわかります。
刺身クラスの手がかりの可视化
ネットワークは正しい対象を刺身と見ているでしょうか。ネットワークが刺身として正しく分類したイメージだけを考え,分類過程で何に焦点を当てているかを確認します。
スコアが最も高かった刺身らしいイメージを読み取り,それに対して梯度-CAMを実行します。
图像NUMBER = 1;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+”(分数:+马克斯(分数)+“)”)
このイメージには刺身と寿司の両方が含まれます。ネットワークは刺身に正しく焦点を当て,寿司は無視しています。ただし,データセットには寿司と刺身が混在するにもかかわらず寿司だけとしてラベル付けされた,他のイメージが含まれます。その結果”,最も寿司らしくない寿司”の例で示したように,これらのイメージを適切に分類する方法をネットワークに学習させるのが難しくなります。これはまた,この特定のケースで予測スコアがあまり高くない理由の説明にもなります。
ハンバーガーに誤分類された刺身の調査
なぜネットワークは刺身をハンバーガーに分类するのでしょうか。ネットワークは,8つの刺身のイメージのうち3つをハンバーガーとして分类しています。データセットにはハンバーガーの観测値が多く含まれ,ネットワークのバイアスになっている可能性があります。
これらのイメージの1つを読み取り,それに対して梯度-CAMを実行します。
图像NUMBER = 4;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+“(生鱼片分数:”+马克斯(分数)+“)”)
ここでは,海苔に巻いた食品がネットワークを混乱させています。これはバンズに肉を挟んだハンバーガーの特徴に似ているためです。これもまた,変化に乏しい刺身データの不具合です。
グリークサラダにに误された刺身の调查
なぜネットワークは刺身をグリークサラダに分类したのでしょうか。ネットワークは6番目のイメージを刺身ではなくグリークサラダとして分类しています。
イメージを読み取ってGrad-CAM手法を実行します。
图像NUMBER = 6;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+“(生鱼片分数:”+马克斯(分数)+“)”那“翻译”那“无”)
セットを追加します。
最もグリークサラダらしいものと最もグリークサラダらしくないもの
食品のデータセットにはグリークサラダの観測値は5つしか含まれません。
これまでの场合と同様に,グリークサラダのイメージを最もグリークサラダらしいものから最もグリークサラダらしくないものへと顺に并べて表示します。
chosenClass =“greek_salad”;numImgsToShow = 5;[sortedScores, imgIdx] = findMaxActivatingImages(imdsTest, chosenClass, predictedScores, numImgsToShow);图plotImages(imdsTest,imgIdx,sortedScores,predictedClasses,numImgsToShow)
この图から,肉のような他の食品と一绪のグリークサラダに対して,ネットワークは満足な结果が得られていないことが分かります。
グリークサラダクラスの手がかりの调查
ネットワークは正しい対象をグリークサラダと见ているでしょうか。ネットワークが正しくグリークサラダとして分类できたイメージだけを考え,分类过程で何に焦点を当てているかを确认します。
ネットワークによるスコアが最も高かったグリークサラダのイメージを読み取ってGrad-CAMを実行します。
图像NUMBER = 1;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+”(分数:+马克斯(分数)+“)”那“翻译”那“无”)
ネットワークは実际のグリークサラダを无视し,代わりに背景を见ています。これは,ネットワークがこのイメージを正しく分类していても,その理由を间违えていることを示します。
ネットワークがグリークサラダとして正しく分類した2番目のイメージを読み取ってGrad-CAMを実行します。
imageNumber = 2;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+”(分数:+马克斯(分数)+“)”那“翻译”那“无”)
通常,グリークサラダには卵がないにもかかわらず,ネットワークはトマトとオリーブに焦点を当てており,グリークサラダとして正しい対象を见ていることがわかります。
ハンバーガーに誤分類されたグリークサラダの調査
なぜネットワークはグリークサラダをハンバーガーに分類するのでしょうか。ネットワークは4番目のイメージをハンバーガーとして分類しています。サラダの中の肉のかたまりが原因でしょうか。
イメージを読み取って梯度-CAMを実行します。
图像NUMBER = 4;观察= augimdsTest.readByIndex (imgIdx (imageNumber));img = observation.input {1};标签= predictedClasses (imgIdx (imageNumber));分数= sortedScores (imageNumber);gradcamMap = computeGradCAM(dlnet, img, softmaxName, convLayerName, label);图alpha = 0.5;plotGradCAM (img, gradcamMapα);标题(字符串(标签)+“(greek_salad分数:”+马克斯(分数)+“)”那“翻译”那“无”)
ネットワークは肉のある領域に焦点を当てています。
まとめ
クラススコアの大小を决めるデータや,ネットワークが高度信息度でで误するをするデータを调查することはがどのに习済みのネットワークがように能しているいるかし有用な洞察洞察が得られるななられるなられるなななです。制品のデータセットのの合书,この例では次のが明显になりまし。
テストデータには,実際は“寿”司であっても“刺身”というように,真のラベルが誤っているイメージが複数含まれる。
ネットワークは “寿司” を “复数の集合した円形のもの” と考えている。しかし,単独の寿司も同様に区别できなければならない。
トッピングや通常と异なる色のある寿司や刺身は,ネットワークを混乱させる。この问题を解决するには,さらに多様な寿司と刺身がデータになければならない。
サラダのような食材を添えた寿司や刺身はサラダクラスとの混乱を生じさせることがある。そのため,サラダを添えた寿司や刺身のイメージをネットワークにさらに学习させなければならない。
グリークサラダと判别できる特徴をネットワークに学习させるには,さらに多くのグリークサラダの観测値を必要とする。
功能dataDir downloadExampleFoodImagesData (url)%下载Example Food Image数据集,包含978张图片%不同类型的食物被分成9类。%版权所有2019 Mathworks,Inc。文件名=“ExampleFoodImageDataset.zip”;fileFullPath =完整文件(DATADIR,文件名);%下载。zip文件到临时目录。如果〜存在(fileFullPath,“文件”)fprintf("下载MathWorks示例食物图像数据集…\n");fprintf(“这可能需要几分钟下载…\n”);websave(fileFullPath,URL);fprintf(“下载完成... \ n”);别的fprintf("跳过下载,文件已经存在…\n");结束%解压文件。%通过检查文件是否存在来检查文件是否已经解压缩%的类目录的企业之一。exampleFolderFullPath =完整文件(DATADIR,“比萨”);如果~存在(exampleFolderFullPath“dir”)fprintf(“解链文件... \ n”);解压(fileFullPath,DATADIR);fprintf(“解压缩完成...... \ n”);别的fprintf("跳过解压缩,文件已经解压缩…\n");结束fprintf(“完成。\ n”);结束功能[sortedScores,imgIdx] = findMaxActivatingImages(IMDS,类名,predictedScores,numImgsToShow)%查找所选择的类的预测分数所选择的类的所有图像%(例如预测分数寿司的寿司上的所有图像)[scoresForChosenClass, imgsofclasssidxs] = findScoresForChosenClass(imds, className, predictedScores);%排序分数降序排列[SortedScores,IDX] = sort(scoresforchosenclass,“下”);只有前几个的%回索引imgIdx = imgsOfClassIdxs (idx (1: numImgsToShow));结束功能[sortedScores,imgIdx] = findMinActivatingImages(IMDS,类名,predictedScores,numImgsToShow)%查找所选择的类的预测分数所选择的类的所有图像%(例如预测分数寿司的寿司上的所有图像)[scoresForChosenClass, imgsofclasssidxs] = findScoresForChosenClass(imds, className, predictedScores);%将分数按升序排序[SortedScores,IDX] = sort(scoresforchosenclass,“提升”);只有前几个的%回索引imgIdx = imgsOfClassIdxs (idx (1: numImgsToShow));结束功能[scoresForChosenClass,imgsOfClassIdxs] = findScoresForChosenClass(IMDS,类名,predictedScores)%查找的className的索引(例如,“寿司”是第九类)uniqueClasses =唯一的(imds.Labels);chosenClassIdx =串(uniqueClasses)==的className;%查找imageDatastore是标签的“类名”影像的索引%(例如找到所有寿司类图片)imgsOfClassIdxs =找到(imd)。标签= =类名);在所有的图像上找到所选班级的预测分数%选择类%(例如预测分数寿司的寿司上的所有图像)scoresForChosenClass = predictedScores(imgsOfClassIdxs,chosenClassIdx);结束功能plotImages(IMDS,imgIdx,sortedScores,predictedClasses,numImgsToShow)对于i=1:numImgsToShow score = sortedScores(i);sortedImgIdx = imgIdx(我);predClass = predictedClasses (sortedImgIdx);correctClass = imds.Labels (sortedImgIdx);imgPath = imds.Files {sortedImgIdx};如果predClass == correctClass颜色=“\ {色绿}”;别的颜色={红}\颜色”;结束副区(3,小区(numImgsToShow./3),i)的imshow(imread(imgPath));标题(预测:“+颜色+串(predClass)+”{黑}\换行符\颜色得分:“+ + num2str(得分)“\ newlineGround真理:“+串(correctClass));结束结束功能[convMap,dScoresdMap] = gradcam(dlnet, dlImg, softmaxName, convLayerName, classfn)日志含义%计算DLNetwork的渐变凸轮映射,取代Softmax层分数的衍生物对于卷积特征映射的给定类的%。[score,convMap] = predict(dlnet, dlImg,“输出”{softmaxName,convLayerName});classScore =分数(classfn);dScoresdMap = dlgradient(classScore,convMap);结束功能gradcamMap = computeGradCAM(dlnet,IMG softmaxName,convLayerName,标签)%为了自动区分,输入的图像img必须是dlarray。dlimg = dlarray(单(img),'SSC');%通过传递dlarray图像来计算gradCAM映射[convMap, dScoresdMap] = dlfeval(@gradcam, dlnet, dlImg, softmaxName, convLayerName, label);%调整梯度映射到净图像尺寸和缩放的分数以用于显示适当的水平。gradcamMap =总和(convMap *总和(dScoresdMap,[1 2]),3。);gradcamMap = ExtractData由(gradcamMap);gradcamMap =重新调整(gradcamMap);gradcamMap = imresize(gradcamMap,dlnet.Layers(1).InputSize(1:2),“方法”那“双三次的”);结束功能plotGradCAM(IMG,gradcamMap,阿尔法)副区(1,2,1)imshow(IMG);H =副区(1,2,2);imshow(IMG)保持在;于imagesc(gradcamMap,'AlphaData'、α);originalSize2 =得到(h,“位置”);colormap飞机colorbar集(h,“位置”,originalSize2);hold关闭;结束
augmentedImageDatastore
|分类
|confusionchart
|dlnetwork
|googlenet
|imageageAtastore.