econメジ分類用の残差ネットワクの学習
この例では,残差結合のある深層学習ニューラルネットワークを作成し,CIFAR-10データで学習を行う方法を説明します。残差結合は畳み込みニュラルネットワクアキテクチャでよく使用される要素です。残差結合を使用すると,ネットワークを通じた勾配フローが改善し,より深いネットワークの学習が可能になります。
多くの用途では,層のシンプルなシケンスで構成されるネットワクを使用するだけで十分です。ただし,用途によっては,各層に複数の層からの入力と複数の層への出力がある,より複雑なグラフ構造のネットワークが必要です。多くの場合,これらのタ。残差ネットワーク(ResNet)はメインネットワーク層をバイパスする残差(またはショートカット)結合のあるDAGネットワークの一種です。残差結合では,パラメーターの勾配がネットワークの出力層からより初期の層へとよりスムーズに伝播するため,更に深いネットワークに学習させることができます。このようにネットワクが深くなると,より難しいタスクで高い精度を実現できます。
ResNetア,キテクチャは,初期層,それに続く“残差ブロック”を含む“スタック”,および最終層で構成されています。次の3種類の残差ブロックがあります。
初期残差ブロック-このブロックは,最初のスタックの開始点に出現します。この例では,ボトルネックコンポネントを使用しています。したがって,このブロックにはダウンサンプリングブロックと同じ層が含まれますが,最初の畳み込み層のストライドは
[1]
のみです。詳細にいては,resnetLayers
を参照してください。標準残差ブロック——このブロックは,各スタック内の最初のダウンサンプリング残差ブロックの後に出現します。このブロックは各スタックに複数回出現し、活性化サ以及ズを保持します。
ダウンサンプリング残差ブロック——このブロックは,各スタック(最初のスタックを除く)の開始点に出現し,各スタックで1回だけ出現します。ダウンサンプリングブロックの最初の畳み込みユニットは,係数2で空間次元をダウンサンプリングします。
各スタックの深さは異なる可能性があります。この例では,徐々に浅くなる3のスタックを使用して残差ネットワクに学習させます。最初のスタックの深さは4,2番目のスタックの深さは3,最後のスタックの深さは2です。
各残差ブロックには深層学習層が含まれています。各ブロックの層の詳細にいては,resnetLayers
を参照してください。
e .メジ分類に適した残差ネットワクを作成して学習を行うには,次の手順に従います。
関数
resnetLayers
を使用して残差ネットワクを作成します。関数
trainNetwork
を使用してネットワクに学習させます。学習済みネットワクはDAGNetwork
オブジェクトになります。関数
分类
と関数预测
を使用して,新しいデタで分類と予測を実行します。
econメジ分類用の事前学習済み残差ネットワクを読み込むこともできます。詳細にいては,事前学習済みの深層ニュラルネットワクを参照してください。
デタの準備
Cifar-10デタセット[1]をダウンロドします。このデタセットには60,000個の。各3 (rgb)があります。デ175mbです。econンタネット接続の速度によっては,econダウンロドプロセスに時間がかかることがあります。
Datadir = tempdir;downloadCIFARData (datadir);
Cifar-10学習openstackメopenstackジとテストopenstackメopenstackジを4次元配列として読み込みます。50000年学習セットには個のイメージが格納されていて,テストセットには10000個のイメージが格納されています。Cifar-10テスト。
[XTrain,TTrain,XValidation,TValidation] = loadCIFARData(datadir);
次のコドを使用して,ランダムにサンプリングされた学習ジを表示できます。
图;idx = randperm(size(XTrain,4),20);我= imtile (XTrain (:,:,:, idx) ThumbnailSize =(96、96));imshow (im)
ネットワク学習に使用するaugmentedImageDatastore
オブジェクトを作成します。学習中に,データストアは縦軸に沿って学習イメージをランダムに反転させ,水平方向および垂直方向に最大4ピクセルだけランダムに平行移動させます。データ拡張は,ネットワークで過適合が発生したり,学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。
imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore(imageSize,XTrain,TTrain,...DataAugmentation = imageAugmenter,...OutputSizeMode =“randcrop”);
ネットワクアキテクチャの定義
関数resnetLayers
を使用して,このデタセットに適した残差ネットワクを作成します。
CIFAR-10イメージは32×32ピクセルであるため,初期ストライドを1にして,サイズ3の小規模な初期フィルターを使用します。初期フィルタの数を16に設定します。
ネットワクの最初のスタックは,初期残差ブロックで始まります。後続の各スタックは,ダウンサンプリング残差ブロックで始まります。ダウンサンプリングブロックの最初の畳み込みユニットは,係数2で空間次元をダウンサンプリングします。ネットワーク全体で各畳み込み層に必要な計算量をほぼ同じに保つには,空間のダウンサンプリングを実行するたびに,フィルターの数を2倍ずつ増加させます。スタックの深さを
[4 3 2]
に,フィルタの数を[16 32 64]
に設定します。
initialFilterSize = 3;numInitialFilters = 16;initialStride = 1;numFilters = [16 32 64];stackDepth = [4 3 2];lgraph = resnetLayers(imageSize,10,...InitialFilterSize = InitialFilterSize,...InitialNumFilters = numInitialFilters,...InitialStride = InitialStride,...InitialPoolingLayer =“没有”,...StackDepth=[4 3 2],...NumFilters=[16 32 64]);
ネットワクを可視化します。
情节(lgraph);
学習オプション
学習オプションの指定。ネットワクの学習を 80 エポック行います。ミニバッチ サイズに比例する学習率を選択し、60 エポック後に学習率を 10 分の 1 に下げます。検証データを使用してエポックごとに 1 回ネットワークを検証します。
miniBatchSize = 128;learnRate = 0.1*miniBatchSize/128valFrequency = floor(size(XTrain,4)/miniBatchSize);options = trainingOptions(“个”,...InitialLearnRate = learnRate,...MaxEpochs = 80,...MiniBatchSize = MiniBatchSize,...VerboseFrequency = valFrequency,...洗牌=“every-epoch”,...情节=“训练进步”,...Verbose = false,...ValidationData = {XValidation, TValidation},...ValidationFrequency = valFrequency,...LearnRateSchedule =“分段”,...LearnRateDropFactor = 0.1,...LearnRateDropPeriod = 60);
ネットワクの学習
trainNetwork
を使用してネットワクに学習させるには,doTraining
フラグを真正的
に設定します。そうでない場合は,事前学習済みのネットワクを読み込みます。このネットワクの学習を高性能なgpuで行った場合,2時間以上かかります。Gpuがない場合,学習に長い時間がかかります。
doTraining = false;如果doTraining net = trainNetwork(augimdsTrain,lgraph,options);其他的负载(“trainedResidualNetwork.mat”,“净”);结束
学習済みネットワクの評価
学習セット(デタ拡張なし)と検証セットに対するネットワクの最終精度を計算します。
[YValPred,probs] = class (net,XValidation);validationError = mean(YValPred ~= TValidation);YTrainPred = category (net,XTrain);trainError = mean(YTrainPred ~= TTrain);disp (“训练错误:”+ trainError*100 +“%”)
训练误差:3.462%
disp ("验证错误:"+ validationError*100 +“%”)
验证错误:9.27%
混同行列をプロットします。列と行の要約を使用して,各クラスの適合率と再現率を表示します。このネットワクは,猫と犬を混同することがよくあります。
图(单位=“归一化”,位置=[0.2 0.2 0.4 0.4]);cm = confusichart (TValidation,YValPred);厘米。Title =验证数据的混淆矩阵;厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;
次のコードを使用して,ランダムにサンプリングされた9つのテストイメージを,予測されたクラスとそのクラスである確率と共に表示できます。
图idx = randperm(size(XValidation,4),9);为i = 1:元素个数(idx)次要情节(3 3 i) imshow (XValidation (:,:,:, idx(我)));Prob = num2str(100*max(pros (idx(i),:)),3);predClass = char(YValPred(idx(i)));标题([predClass +”、“+问题+“%”])结束
参照
克里哲夫斯基,亚历克斯。“从微小的图像中学习多层特征。”(2009)。https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf
何凯明,张翔宇,任少卿,孙健。“图像识别的深度残差学习。”在IEEE计算机视觉和模式识别会议论文集第770-778页。2016.
参考
resnetLayers
|resnet3dLayers
|trainNetwork
|trainingOptions
|layerGraph
|analyzeNetwork