最新のリリースでは、このページがまだ翻訳されていません。このページの最新版は英語でご覧になれます。

イメージ分類用の残差ネットワークの学習

この例では,残差結合のある深層学習ニューラルネットワークを作成し,CIFAR-10データで学習を行う方法を説明します。残差結合は畳み込みニューラルネットワークアーキテクチャでよく使用される要素です。残差結合を使用すると,ネットワークを通じた勾配フローが改善し,より深いネットワークの学習が可能になります。

多くの用途では,層のシンプルなシーケンスで構成されるネットワークを使用するだけで十分です。ただし,用途によっては,各層に複数の層からの入力と複数の層への出力がある,より複雑なグラフ構造のネットワークが必要です。多くの場合,これらのタイプのネットワークは有向非循環グラフ(DAG)ネットワークと呼ばれます。残差ネットワークは,メインネットワーク層をバイパスする残差(またはショートカット)結合のあるDAGネットワークの一種です。残差結合では,パラメーターの勾配がネットワークの出力層からより初期の層へとよりスムーズに伝播するため,更に深いネットワークに学習させることができます。このようにネットワークが深くなると,より難しいタスクで高い精度を実現できます。

グラフ構造を持つネットワークを作成して学習させるには、以下の手順に従います。

  • 分层图を使用して分层图オブジェクトを作成します。層グラフでネットワーク アーキテクチャが指定されます。空の層グラフを作成してから、この層グラフに層を追加できます。ネットワーク層の配列から直接、層グラフを作成することもできます。この場合、分层图は配列内の層を1つずつ結合します。

  • addLayersを使用して層グラフに層を追加し,removeLayersを使用してグラフから層を削除します。

  • connectLayersを使用して層を他の層に結合し,断开层を使用して他の層から層を切り離します。

  • 情节を使用してネットワークアーキテクチャをプロットします。

  • 列车网络を使用してネットワークに学習させます。学習済みネットワークはDAGNetworkオブジェクトになります。

  • 分类および预测を使用して,新しいデータで分類と予測を実行します。

イメージ分類用の事前学習済みネットワークを読み込むこともできます。詳細については,事前学習済みの深層ニューラル ネットワークを参照してください。

データの準備

CIFAR-10データセット [1] をダウンロードします。このデータセットには 60,000 個のイメージが格納されています。各イメージのサイズは 32 x 32で 3.つのカラー チャネル (RGB)があります。データセットのサイズは 175MBです。インターネット接続の速度によっては、ダウンロード プロセスに時間がかかることがあります。

datadir = tempdir;downloadCIFARData (datadir);
正在下载CIFAR-10数据集(175 MB)。这可能需要一段时间…完成。

CIFAR-10学習イメージとテスト イメージを 4.次元配列として読み込みます。学習セットには 50,000 個のイメージが格納されていて、テスト セットには 10,000 個のイメージが格納されています。CIFAR-10テスト イメージをネットワークの検証用に使用します。

[XTrain, YTrain XValidation YValidation] = loadCIFARData (datadir);

次のコードを使用して、ランダムにサンプリングされた学習イメージを表示できます。

图;idx=randperm(大小(XTrain,4),20);im=imtile(XTrain(:,:,:,idx),“ThumbnailSize”,[96,96]);imshow(im)

ネットワーク学習に使用するaugmentedImageDatastoreオブジェクトを作成します。学習中に,データストアは縦軸に沿って学習イメージをランダムに反転させ,水平方向および垂直方向に最大4ピクセルだけランダムに平行移動させます。データ拡張は,ネットワークで過適合が発生したり,学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“兰迪翻译”, pixelRange);augimdsTrain = augmentedImageDatastore(图象尺寸、XTrain YTrain,...“数据增强”imageAugmenter,...“OutputSizeMode”,“randcrop”);

ネットワーク アーキテクチャの定義

残差ネットワークアーキテクチャは以下のコンポーネントで構成されます。

  • 畳み込み層,バッチ正規化層,およびReLU層が順に結合された主分岐。

  • 主分岐の畳み込みユニットをバイパスする"残差結合"。残差結合と畳み込みユニットの出力は要素単位で追加されます。活性化のサイズが変化すると,残差結合も1 x 1畳み込み層を含まなければなりません。残差結合では,パラメーターの勾配がネットワークの出力層からより初期の層へとよりスムーズに流れるため,更に深いネットワークに学習させることができます。

主分岐の作成

まず,ネットワークの主分岐を作成します。主分岐には5つのセクションが含まれています。

  • イメージ入力層と、活性化のある初期畳み込みを含む初期セクション。

  • 異なる特徴サイズ(32 x 32, 16 xおよび8 x 8)を持つ畳み込み層の3つの段階。各段階にはN個の畳み込みユニットが含まれています。ここでは、N = 2です。各畳み込みユニットには,活性化のある3 x 3畳み込み層が2つ含まれています。netWidthパラメーターはネットワークの幅であり,ネットワークの最初の段階における畳み込み層のフィルターの数として定義されます。2番目と3番目の段階における最初の畳み込みユニットは,係数2で空間次元をダウンサンプリングします。ネットワーク全体で各畳み込み層に必要な計算量をほぼ同じに保つには,空間のダウンサンプリングを実行するたびに,フィルターの数を2倍ずつ増加させます。

  • グローバル平均プーリング層、全結合層、ソフトマックス層、および分類層のある最後のセクション。

convolutionalUnit (numF、跨步、标签)を使用して畳み込みユニットを作成します。numFは各層の畳み込みフィルターの数です。大步走はユニットの最初の畳み込み層のストライドで、标签は層の名前の先頭に追加する文字配列です。関数卷积单位の定義は,この例の終わりで行います。

すべての層に一意の名前を付けます。畳み込みユニットの層の名前は“SjUk”で始まります。ここで,Jは段階のインデックスで、Kはその段階内の畳み込みユニットのインデックスです。たとえば,“S2U1”は段階 2.ユニット 1.を表します。

netWidth=16;层=[imageInputLayer([32 3],“姓名”,“输入”) convolution2dLayer (3 netWidth“填充”,“一样”,“姓名”,“康文普”) batchNormalizationLayer (“姓名”,“BNInp”)雷卢耶(“姓名”,“reluInp”)卷积单元(netWidth,1,‘S1U1’)附加层(2,“姓名”,“add11”)雷卢耶(“姓名”,“relu11”)卷积单元(netWidth,1,‘S1U2’)附加层(2,“姓名”,“add12”)雷卢耶(“姓名”,“relu12”)卷积单元(2*netWidth,2,“S2U1”)附加层(2,“姓名”,“add21”)雷卢耶(“姓名”,“relu21”)卷积单元(2*netWidth,1,‘S2U2’)附加层(2,“姓名”,“add22”)雷卢耶(“姓名”,“relu22”) convolutionalUnit (4 * netWidth 2‘S3U1’)附加层(2,“姓名”,“add31”)雷卢耶(“姓名”,“relu31”) convolutionalUnit (4 * netWidth 1‘S3U2’)附加层(2,“姓名”,“add32”)雷卢耶(“姓名”,“relu32”) averagePooling2dLayer (8,“姓名”,“globalPool”)完全连接层(10,“姓名”,“fcFinal”)软MaxLayer(“姓名”,“softmax”)分类层(“姓名”,“classoutput”));

層配列から層グラフを作成します。分层图のすべての層を順に結合します。層グラフをプロットします。

lgraph=图层图形(图层);图形(“单位”,“正常化”,“位置”,[0.2 0.2 0.6 0.6]); 绘图(lgraph);

残差結合の作成

畳み込みユニットの周りに残差結合を追加します。ほとんどの残差結合は,演算を実行せず,畳み込みユニットの出力に要素単位で単に追加されます。

“reluInp”層から“add11”層への残差結合を作成します。層の作成時に加算層への入力数を 2.に指定しているため、層には'在1'および“in2”という名前の 2.つの入力があります。最初の畳み込みユニットの最後の層は、既に'在1'入力に結合されています。さらに,加算層は最初の畳み込みユニットと“reluInp”層の出力を合計します。

同様に,“relu11”層を“add12”層の 2.番目の入力に結合します。層グラフをプロットして、層を正しく結合したことを確認します。

lgraph=连接层(lgraph,“reluInp”,“add11 / in2”); lgraph=连接层(lgraph,“relu11”,“add12/in2”);数字(“单位”,“正常化”,“位置”,[0.2 0.2 0.6 0.6]); 绘图(lgraph);

畳み込みユニットにおける層の活性化のサイズが変化した場合(つまり,空間的にダウンサンプリングされ,チャネルの次元でアップサンプリングされた場合),残差結合の活性化もサイズを変更しなければなりません。1 x 1畳み込み層をそのバッチ正規化層と共に使用して,残差結合の活性化サイズを変更します。

skip1 =[卷积2dlayer (1,2*netWidth,“大步走”2,“姓名”,“skipConv1”) batchNormalizationLayer (“姓名”,“skipBN1”));lgraph = addLayers (lgraph skip1);lgraph=连接层(lgraph,“relu12”,“skipConv1”); lgraph=连接层(lgraph,“skipBN1”,“add21 / in2”);

ネットワークの2番目の段階に恒等結合を追加します。

lgraph=连接层(lgraph,“relu21”,“add22 / in2”);

別の 1 x 1畳み込み層をそのバッチ正規化層と共に使用して、2.番目と 3.番目の段階の間にある残差結合の活性化サイズを変更します。

skip2 =[卷积2dlayer (1,4*netWidth,“大步走”2,“姓名”,“skipConv2”) batchNormalizationLayer (“姓名”,“skipBN2”)]; lgraph=addLayers(lgraph,skip2);lgraph=连接层(lgraph,“relu22”,“skipConv2”); lgraph=连接层(lgraph,“skipBN2”,“add31 / in2”);

最後の恒等結合を追加し、最後の層グラフをプロットします。

lgraph=连接层(lgraph,“relu31”,“add32/in2”);数字(“单位”,“正常化”,“位置”,[0.2 0.2 0.6 0.6]); 绘图(lgraph)

より深いネットワークの作成

任意の深さおよび幅のCIFAR-10データの残差結合を持つ層グラフを作成するには,サポート関数剩余法尔图を使用します。

lgraph=剩余Lcifarlgraph(网络宽度、数量、单位类型)は,残差結合のあるCIFAR-10データの層グラフを作成します。

  • netWidthはネットワークの幅であり、ネットワークの最初にある 3 x 3畳み込み層のフィルターの数として定義されます。

  • 核弹は、ネットワークの主分岐の畳み込みユニットの数です。ネットワークは 3.つの段階で構成されていて、各段階には同じ数の畳み込みユニットがあるため、核弹は3の整数倍でなければなりません。

  • 单位类型は畳み込みユニットのタイプで,“标准”または“瓶颈”として指定します。標準の畳み込みユニットは,2つの3 x 3畳み込み層で構成されています。ボトルネック畳み込みユニットは,チャネルの次元でダウンサンプリングするための1 x 1の層,3 x 3畳み込み層,およびチャネルの次元でアップサンプリングするための1 x 1の層の3つの畳み込み層で構成されています。そのため,ボトルネック畳み込みユニットにある畳み込み層の数は,標準のユニットより50%多くなりますが,空間的な3 x 3畳み込みの数の半分でしかありません。2つのユニットタイプの計算量は同程度ですが,残差結合で伝播される特徴の合計数は,ボトルネックユニットを使用する場合の方が4倍多くなります。合計の深さは,逐次畳み込み層と全結合層の最大数として定義され,標準ユニットを持つネットワークでは2 *核弹+ 2となり,ボトルネックユニットを持つネットワークでは3 *核弹+ 2 となります。

9つの標準畳み込みユニット (1 つの段階あたり 3.ユニット) があり、幅が 16の残差ネットワークを作成します。ネットワークの深さの合計は 2*9+2 = 20 です。

numnits=9;netWidth=16;lgraph=residualCIFARlgraph(netWidth,numnits,“标准”);数字(“单位”,“正常化”,“位置”,[0.1 0.1 0.8 0.8]);情节(lgraph)

ネットワークの学習

学習オプションの指定。ネットワークの学習を 80エポック行います。ミニバッチ サイズに比例する学習率を選択し、60エポック後に学習率を 10分の 1.に下げます。検証データを使用してエポックごとに 1.回ネットワークを検証します。

miniBatchSize=128;learnRate=0.1*miniBatchSize/128;valFrequency=floor(尺寸(XTrain,4)/miniBatchSize);选项=培训选项(“个”,...“初始学习率”,learnRate,...“MaxEpochs”,80,...“MiniBatchSize”miniBatchSize,...“VerboseFrequency”,valFrequency,...“洗牌”,“every-epoch”,...“情节”,“训练进步”,...“详细”错误的...“验证数据”{XValidation, YValidation},...“ValidationFrequency”,valFrequency,...“LearnRateSchedule”,“分段”,...“LearnRateDropFactor”,0.1,...“LearnRateDropPeriod”,60);

列车网络を使用してネットワークに学習させるには,溺爱フラグを符合事实的に設定します。そうでない場合は,事前学習済みのネットワークを読み込みます。このネットワークの学習を適切なGPUで行った場合,約2時間かかります。GPUがない場合,学習に長い時間がかかります。

doTraining = false;如果doTraining trainedNet = trainNetwork(augimdsTrain,lgraph,options);其他的负载(“cifarnet - 20 - 16. -垫”,“trainedNet”);终止

学習済みネットワークの評価

学習セット(データ拡張なし)と検証セットに対するネットワークの最終精度を計算します。

(YValPred,聚合氯化铝)= (trainedNet XValidation)进行分类;validationError = mean(YValPred ~= YValidation);YTrainPred =分类(trainedNet XTrain);= mean(YTrainPred ~= YTrain);disp (“训练误差:+ trainError * 100 +"%")
训练误差:2.862%
disp (“验证错误:”+ validationError * 100 +"%")
验证错误:9.76%

混同行列をプロットします。列と行の要約を使用して、各クラスの適合率と再現率を表示します。このネットワークは、猫と犬を混同することがよくあります。

身材(“单位”,“正常化”,“位置”,[0.2 0.2 0.4 0.4]);厘米= confusionchart (YValidation YValPred);厘米。Title =“验证数据的混淆矩阵”;厘米。ColumnSummary =“列规格化”;cm.概述=“row-normalized”

次のコードを使用して、ランダムにサンプリングされた 9つのテスト イメージを、予測されたクラスとそのクラスである確率と共に表示できます。

图idx=randperm(尺寸(XValidation,4),9);对于i=1:numel(idx)子图(3,3,i)imshow(XValidation(:,:,:,idx(i));prob=num2str(100*max(probs(idx(i),:)),3);predClass=char(YValPred(idx(i));title([predClass,”、“概率,“%”])终止

convolutionalUnit (numF、跨步、标签)は 2.つの畳み込み層と対応するバッチ正規化層および 雷卢層のある層の配列を作成します。numFは畳み込みフィルターの数です。大步走は最初の畳み込み層のストライドで,标签はすべての層の名前の先頭に追加されるタグです。

作用层=卷积单位(numF,步幅,标记)层=[卷积2层(3,numF,“填充”,“一样”,“大步走”大步走“姓名”,标签,“conv1”])批处理规范化层(“姓名”,标签,“BN1”])雷卢耶(“姓名”,标签,“relu1”])卷积2dlayer(3,numF,“填充”,“一样”,“姓名”,标签,“conv2”])批处理规范化层(“姓名”,标签,“BN2”)));终止

参照

[1] Krizhevsky,亚历克斯。“从微小图像中学习多层特征。”(2009).https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

[2] 何开明、张向宇、任少清和孙健,《图像识别的深度剩余学习》,年IEEE计算机视觉和模式识别会议记录, 770 - 778页。2016.

参考

|||

関連するトピック