。
この例では,残差结合のある深层学习ニューラルネットワークを作成し,CIFAR-10データで学习を行う方法を说明します。残差结合は畳み込みニューラルネットワークアーキテクチャでよく使用される要素です。残差结合を使用すると,ネットワークを通じた勾配フローが改善し,より深いネットワークの学习が可能になります。
多くの用途では,层のシンプルなシーケンスで构成されるネットワークを使用するだけで十分です。ただし,用途によっては,各层に复数の层からの入力と复数の层への出力がある,より复雑なグラフ构造のネットワークが必要です。多くの场合,これらのタイプのネットワークは有向非循环グラフ(DAG)ネットワークと呼ばれます。残差ネットワークは,メインネットワーク层をバイパスする残差(またはショートカット)结合のあるDAGネットワークの一种です。残差结合では,パラメーターの勾配がネットワークの出力层からより初期の层へとよりスムーズに伝播するため,更に深いネットワークに学习させることができます。このようにネットワークが深くなると,より难しいタスクで高い精度を実现できます。
グラフ构造を持つネットワークを作成して学习させるには,以下の手顺に従います。
分层图
をを用して分层图
オブジェクトを作成します。层グラフでネットワークアーキテクチャが指定されます。空の层グラフを作成してから,この层グラフに层を追加できます。ネットワーク层の配列から直接,层グラフを作成することもできます。この场合,分层图
は配列内の层を1つずつ结合します。
addLayers
を使用して层グラフに层を追加し,removeLayers
を使用してグラフから层を削除します。
connectLayers
を使用して层を他の层に结合し,disconnectLayers
を使用して他の层から层を切り离します。
阴谋
を使用してネットワークアーキテクチャをプロットします。
Trainnetwork.
を使用してネットワークに学习させます。学习済みネットワークはDagnetwork.
オブジェクトになります。
分类
および预测
をを使し,新しいデータで分别と予测を行しし。
イメージ分类用の事前学习済みネットワークを読み込むこともできます。详细については,事前学习済みの深层ニューラルネットワークを参照してください。
CIFAR-10データセット[1]をダウンロードします。このデータセットには60000个のイメージが格纳されています。各イメージのサイズは32×32で3つのカラーチャネル(RGB)があります。データセットのサイズは175 MBです。インターネット接続の速度によっては,ダウンロードプロセスに时间がかかることがあります。
DATADIR = TEMPDIR;downloadCIFARData(DATADIR);
CIFAR-10学习イメージとテストイメージを4次元配列として読み込みます。学习セットには50000个のイメージが格纳されていて,テストセットには万个のイメージが格纳されています.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,......'RandYTranslation',pixelRange);augimdsTrain = augmentedImageDatastore(IMAGESIZE,XTrain,YTrain,......'DataAugmentation',imageAugmenter,......'outputsizeMode'那'randcrop');
残差ネットワークアーキテクチャは以下のコンポーネントで构成されます。
畳み込み层,バッチ正规化层,および释放が顺ににされたた分。
主分岐の畳み込みユニットをバイパスする“残差留合合”。残差残差合とと畳み込みユニットの出は要素要素で活性されサイズがががするとと结のもサイズががするとさをももががするする层もでは,パラメーターパラメーターの勾配勾配がのの层层よりより初の层へとよりスムーズ流れるためためためためためことができことができことができ习习せることができ
主分岐の作成
まず,ネットワークの主分岐を作成します。主分岐には5つのセクションが含まれています。
イメージ入力层と,活性化のある初期畳み込みを含む初期セクション。
异なる特徴サイズ(32×32,16×16および8×8)を持つ畳み込み层の3つの段阶。各段阶にはN个の畳み込みユニットが含まれています。ここでは,n = 2です。各畳み込みユニットには,活性化のある3 x 3畳み込み层が2つ含まれてますますます。netWidth
パラメーターはネットワークの幅であり,ネットワークの最初の段阶における畳み込み层のフィルターの数として定义されます0.2番目と3番目の段阶における最初の畳み込みユニットは,系数2で空间次元をダウンサンプリングします。ネットワーク全体で各畳み込み层に必要な计算量をほぼ同じに保つには,空间のダウンサンプリングを実行するたびに,フィルターの数を2倍ずつ増加させます。
グローバル平均プーリング层,全结合层,ソフトマックス层,および分类层のある最后のセクション。
卷积(numf,stride,标签)
を使用して畳み込みユニットを作成します。numf.
は各层の畳み込みフィルターの数です。步行
はユニットの最初の畳み込み层のストライドで,标签
は层の名前の先头に追加する文字配列です。关数卷积帆船池
のの定义,この例の终わりで行。
すべての层に一意の名前を付けます。畳み込みユニットの层の名前は'sjuk'
で始まります。ここで,j
は段阶のインデックスで,K.
はその段阶内の畳み込みユニットのインデックスです。たとえば,'S2U1'
は段阶2,ユニット1を表します。
NetWidth = 16;层= [imageInputLayer([32 32 3],'姓名'那'输入')convolution2dLayer(3,netWidth,'填充'那'相同的'那'姓名'那'召集')batchNormalizationLayer('姓名'那'BNInp')reluLayer('姓名'那'reluinp')卷大池(NetWidth,1,'s1u1')附加层(2,'姓名'那'ADD11')reluLayer('姓名'那'relu11')卷大池(NetWidth,1,'s1u2')附加层(2,'姓名'那'ADD12')reluLayer('姓名'那'relu12')卷积帆船(2 * NetWidth,2,'S2U1')附加层(2,'姓名'那'ADD21')reluLayer('姓名'那'relu21')卷大钢筋(2 * NetWidth,1,'S2U2')附加层(2,'姓名'那'ADD22')reluLayer('姓名'那'relu22')convolutionalUnit(4 * netWidth,2,'s3u1')附加层(2,'姓名'那'ADD31')reluLayer('姓名'那'relu31')convolutionalUnit(4 * netWidth,1,'s3u2')附加层(2,'姓名'那'ADD32')reluLayer('姓名'那'relu32')averagePooling2dLayer(8,'姓名'那'globalPool')全连接层(10,'姓名'那'fcfinal')softmaxlayer('姓名'那'SOFTMAX'scassificationlayer('姓名'那'classoutput')];
层配列から层グラフを作成します。分层图
は层数
のすべての层を顺に结合します。层グラフをプロットします。
lgraph = layerGraph(层);数字('单位'那“规范化”那'位置',[0.2 0.2 0.6 0.6]);积(lgraph);
残差结合の作成
畳み込みユニットの周りに残差结合を追加します。ほとんどの残差结合は,演算を実行せず,畳み込みユニットの出力に要素単位で単に追加されます。
'reluinp'
层から'ADD11'
层への残差结合を作成します。层の作成时に加算层への入力数を2に指定しているため,层には'in1'
および'in2'
という名前の2つの入力があります。最初の畳み込みユニットの最后の层は,既に'in1'
入,加入层は最初のユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニットユニット'reluinp'
层の出力を合计します。
同様に,'relu11'
层を'ADD12'
层の2番目の入力に结合します。层グラフをプロットして,层を正しく结合したことを确认します。
Lgraph = ConnectLayers(LAPHAGE,'reluinp'那'ADD11 /英寸2');Lgraph = ConnectLayers(LAPHAGE,'relu11'那'Add12 / In2');数字('单位'那“规范化”那'位置',[0.2 0.2 0.6 0.6]);积(lgraph);
畳み込みユニットにおける层の活性化のサイズが変化した场合(つまり,空间的にダウンサンプリングされ,チャネルの次元でアップサンプリングされた场合),残差结合の活性化もサイズを変更しなければなりません0.1 X 1畳み込み层をそのバッチ正规化层と共に使用して,残差结合の活性化サイズを変更します。
SKIP1 = [convolution2dLayer(1,2 * netWidth,'走吧'2,'姓名'那'skipConv1')batchNormalizationLayer('姓名'那'skipbn1')];lgraph = addLayers(lgraph,SKIP1);Lgraph = ConnectLayers(LAPHAGE,'relu12'那'skipConv1');Lgraph = ConnectLayers(LAPHAGE,'skipbn1'那'ADD21 /英寸2');
ネットワークの2番目の段阶に恒等结合を追加します。
Lgraph = ConnectLayers(LAPHAGE,'relu21'那'ADD22 /英寸2');
别の1×1畳み込み层をそのバッチ正规化层と共に使用して,2-番目と3番目の段阶の间にある残差结合の活性化サイズを変更します。
SKIP2 = [convolution2dLayer(1,4 * netWidth,'走吧'2,'姓名'那'skipConv2')batchNormalizationLayer('姓名'那'skipbn2')];Lgraph = Addlayers(LGraph,Skip2);Lgraph = ConnectLayers(LAPHAGE,'relu22'那'skipConv2');Lgraph = ConnectLayers(LAPHAGE,'skipbn2'那'ADD31 /英寸2');
最后の恒等结合を追加し,最后の层グラフをプロットします。
Lgraph = ConnectLayers(LAPHAGE,'relu31'那'Add32 / In2');数字('单位'那“规范化”那'位置',[0.2 0.2 0.6 0.6]);图(LGROPL)
任意の深さおよび幅のCIFAR-10データの残差结合を持つ层グラフを作成するには,サポート关数ResealutCifarlgraph..を使用します。
Lgraph = ResealualCifarlgraph(NetWidth,NumUnits,Unittype)
は,残差结合のあるCIFAR-10データの层グラフを作成します。
netWidth
はネットワークの幅であり,ネットワークの最初にある3×3畳み込み层のフィルターの数として定义されます。
numunits.
は,ネットワークの主分岐の畳み込みユニットの数です。ネットワークは3つの段阶で构成されていて,各段阶には同じ数の畳み込みユニットがあるため,numunits.
は3の整数倍でなければなりません。
单位类型
は畳み込みユニットのタイプで,“标准”
または“瓶颈”
として指定します。标准の畳み込みユニットは,2つの3×3畳み込み层で构成されています。ボトルネック畳み込みユニットは,チャネルの次元でダウンサンプリングするための1×1の层,3×3畳み込み层,およびチャネルの次元でアップサンプリングするための1×1の层の3つの畳み込み层で构成されています。そのため,ボトルネック畳み込みユニットにある畳み込み层の数は,标准のユニットより50%多くなりますが,空间的な3×3畳み込みの数の半分でしかありません0.2つのユニットタイプの计算量は同程度ですが,残差结合で伝播される特徴の合计数は,ボトルネックユニットを使用する场合の方が4倍多くなります。合计の深さは,逐次畳み込み层と全结合层の最大数として定义され,标准ユニットを持つネットワークでは2 *numunits.
+ 2となり,ボトルネックユニットを持つネットワークはは3 *numunits.
+ 2となります。
9つの标准畳み込みユニット(1つの段阶あたり3ユニット)があり,幅が16の残差ネットワークを作成します。ネットワークの深さの合计は2 * 9 + 2 = 20です。
numUnits = 9;NetWidth = 16;Lgraph = ResealutCifarlgraph(NetWidth,NumUnits,“标准”);数字('单位'那“规范化”那'位置',[0.1 0.1 0.8]);图(LGROPL)
学习オプションの指定。ネットワークの学习を80エポック行います。ミニバッチサイズに比例する学习率を选択し,60エポック后に学习率を10分の1に下げます。検证データを使用してエポックごとに1回ネットワークを検证します。
minibatchsize = 128;LearnRate = 0.1 * minibatchsize / 128;瓦尔频=地板(尺寸(XTrain,4)/小匹匹匹匹匹匹匹配);选项= trainingOptions('SGDM'那......'InitialLearnRate',学习,......'MaxEpochs'80,......'minibatchsize',miniBatchSize,......'verbosefrequency',瓦尔复克,......“洗牌”那“每个历元”那......“情节”那“训练进度”那......'verbose',错误的,......'ValidationData',{xvalidation,yvalidation},......'ValidationFrequency',瓦尔复克,......'LearnRateSchedule'那“分段”那......'学习ropfactor',0.1,......'LearnRateDropPeriod',60);
Trainnetwork.
をを用してネットワークネットワーク习ささせるは,用圆形
フラグを真的
ににします。そうでないそうでない合,事前学习済みのネットワーク読み込みますます。このこのネットワーク学校を适切gpuで行ったななgpuで行っ场た场合并,约2时间かかります.gpuがないない合,学校にに时间がかかりかかり。
doTraining = FALSE;如果doTraining trainedNet = trainNetwork(augimdsTrain,lgraph,选项);别的加载('CIFARNet-20-16.mat'那'trainedNet');结尾
学习セット(データ拡张なし)と検证セットに対するネットワークの最终精度を计算します。
[YValPred,probs] =分类(trainedNet,XValidation);validationError =平均值(YValPred〜= YValidation);YTrainPred =分类(trainedNet,XTrain);trainError =平均值(YTrainPred〜= YTrain);DISP(“培训错误:”+ trainError * 100 +“%”)
培训错误:2.862%
DISP(“验证错误:”+ validationError * 100 +“%”)
验证错误:9.76%
混同行列をプロットします。列と行の要约を使用して,各クラスの适合率と再现率を表示します。このネットワークは,猫と犬を混同することがよくあります。
数字('单位'那“规范化”那'位置'[0.2 0.2 0.4 0.4]);厘米= confusionchart(YValidation,YValPred);cm.Title =“混淆矩阵用于验证数据”;cm.columnsummary =“列归一化”;cm.rowsummary ='行标准化';
次のコードを使用して,ランダムにサンプリングされた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)));标题([predcrass,',',概率,'%'])结尾
卷积(numf,stride,标签)
は2つの畳み込み层と対応するバッチ正规化层およびRELU层のある层の配列を作成します。numf.
は畳み込みフィルターの数です。步行
は最初の畳み込み层のストライドストライドで,标签
はすべての层の名前の先头に追加されるタグです。
功能图层=卷积器(numf,stride,标签)图层= [卷积2dlayer(3,numf,'填充'那'相同的'那'走吧',步幅,'姓名',[标签,'CONV1'])BatchnormalizationLayer('姓名',[标签,'BN1'])剥离('姓名',[标签,'relu1'])卷积2dlayer(3,numf,'填充'那'相同的'那'姓名',[标签,'CONV2'])BatchnormalizationLayer('姓名',[标签,'BN2'])];结尾
[1] Krizhevsky,Alex。“从微小图像学习多层特征。”(2009)。https://www.cs.toronto.edu/~kriz/learning-features-2009-tra.pdf.
[2]他,Kaiming,湘雅张,少清任,剑孙。“图像识别的深度剩余学习。”在计算机愿景和模式识别的IEEE会议的诉讼程序,第770-778。2016年。