Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

複数の出力をもつネットワークの学習

この例はの数字のラベル回転角度を予测予测,,,复数のの出力をもつ深层学习学习ネットワークネットワークにににに学习

复数のあるに学习せるはカスタムループをを使用してネットワークネットワークに学习学习させなけれなければば

学習データの読み込み

关数Digittrain4DarrayDataはイメージ数字ラベ​​ルおよび方向から回転角度読み込みます。イメージイメージ,ラベルラベルについてについてについてarraydatastoreオブジェクトをしてから关数关数结合を使用して、すべての学習データを含む単一のデータストアを作成します。クラス名と、離散でない応答の数を抽出します。

[Xtrain,Ytrain,Anglestrain] = DigitTrain4DarrayData;dsxtrain = arraydatastore(xtrain,“迭代饮食”,4);dsytrain = arraydatastore(ytrain);dsanglestrain = arraydatastore(anglestrain);dstrain = combine(dsxtrain,dsytrain,dsanglestrain);classNames =类别(ytrain);numClasses = numel(classNames);numObservations = numel(ytrain);

学习データののイメージ表示します。

idx = randperm(numObservations,64); I = imtile(XTrain(:,:,:,idx)); figure imshow(I)

深層学習モデルの定義

ラベルと回転角度の両方を予測する次のネットワークを定義します。

  • 16个5x 5フィルターもつもつもつもつもつもつもつ

  • 32个のののののフィルターフィルターもつもつもつつののののののの

  • 32 個の 1 x 1 の畳み込みをもつ convolution-batchnorm-ReLU ブロックを含む、前述の 2 つのブロックのスキップ接続

  • 加算をするスキップ接続マージマージ

  • 分類出力用に、サイズが 10 (クラス数) の全結合演算とソフトマックス演算をもつ分岐

  • 回帰出力用に、サイズが 1 (応答数) の全結合演算をもつ分岐

層のメイン ブロックを層グラフとして定義します。

layers = [ imageInputLayer([28 28 1],'Normalization',,,,'没有任何',,,,'姓名',,,,'在') convolution2dLayer(5,16,'Padding',,,,'相同的',,,,'姓名',,,,'conv1') batchNormalizationLayer('姓名',,,,'bn1')relulayer('姓名',,,,'relu1') convolution2dLayer(3,32,'Padding',,,,'相同的',,,,“大步”,,,,2,'姓名',,,,'conv2') batchNormalizationLayer('姓名',,,,'bn2')relulayer('姓名',,,,'relu2') convolution2dLayer(3,32,'Padding',,,,'相同的',,,,'姓名',,,,'conv3') batchNormalizationLayer('姓名',,,,'bn3')relulayer('姓名',,,,'relu4')加法器(2,'姓名',,,,'添加')完整连接的layerer(numClasses,'姓名',,,,'fc1')SoftMaxlayer('姓名',,,,'softmax');lgraph = layergraph(layers);

スキップ接続追加します。

layers = [ convolution2dLayer(1,32,“大步”,,,,2,'姓名',,,,'convskip') batchNormalizationLayer('姓名',,,,'bnskip')relulayer('姓名',,,,'reluSkip');lgraph = addlayers(lgraph,layers);lgraph =连接器(lgraph,'relu1',,,,'convskip');lgraph =连接器(lgraph,'reluSkip',,,,“加法/IN2”);

回帰用全层を追加し。。

layers =完整连接的layer(1,'姓名',,,,'fc2');lgraph = addlayers(lgraph,layers);lgraph =连接器(lgraph,'添加',,,,'fc2');

層グラフをプロットで表示します。

figure plot(lgraph)

層グラフからdlnetworkオブジェクトを作成します。

dlnet = dlnetwork(lgraph)
dlnet =具有属性的dlnetwork:层:[17×1 nnet.cnn.layer.layer]]连接:[17×2表]可学习物:[20×3表]状态:[8×3表] inputNames:{'in'in'in'in'in'in'} outputNames:{'softmax''fc2'}

モデル勾配关数定义

例のにリストれている关数modelGradientsを作成します。この関数は、dlnetworkオブジェクトdlnet、入力データDLXのミニバッチと対応するターゲットT1およびT2(それぞれラベルを)ををとして学习についての损失の勾配勾配,されたたネットワークネットワーク状态状态,,および対応

学习オプションの指定

学習オプションを指定します。ミニバッチ サイズを 128 として、学習を 30 エポック行います。

numEpochs = 30; miniBatchSize = 128;

学习の状况プロットに化します。

情节=“训练过程”;

モデルの学習

Minibatchqueueを使用,イメージミニを处理管理し。各ミニバッチでで次をを。。。

  • カスタム ミニバッチ前処理関数预处理(この例に)ををし,クラスラベルラベルををををを符号符号符号。

  • イメージデータをラベル'SSCB'(spatial、spatial、channel、batch) で書式設定します。既定では、Minibatchqueueオブジェクトは基となるががsingleDlarrayオブジェクトにデータを変換します。書式をクラス ラベルまたは角度に追加しないでください。

  • gpuができる,,,でで行います。で,,Minibatchqueueオブジェクトは,GPU が利用可能な場合、各出力をgpuArrayに変換します。GPUを使用するには,并行计算工具箱™,およびCompute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU が必要です。

mbq = minibatchqueue(dsTrain,。。。'MiniBatchSize',,,,miniBatchSize,。。。'MiniBatchFcn',@preprocessdata,。。。'MINIBATCHFORMAT',{'SSCB',,,,'',,,,''});

学习ループしモデルモデル学习させ。。各,,データデータををシャッフルシャッフルシャッフルししててののミニミニバッチバッチををループでで回し回しますますますます。。。。するするたびたびたびたびたび次を行い。

  • 关数dlfevalおよびmodelGradientsを使用ての勾配损失を评価。

  • 关数adamupdateを使用してネットワーク パラメーターを更新。

学習の進行状況プロットを初期化します。

如果绘图==“训练过程”图LineLosttrain = AnimatedLine('Color',[0.85 0.325 0.098]);Ylim([0 Inf])Xlabel("Iteration")ylabel(“失利”) grid结尾

亚当用にを化し。。

trailingavg = [];trailingavgsq = [];

モデルに学習させます。

iteration = 0; start = tic;% Loop over epochs.为了epoch = 1:numepochs%洗牌数据。洗牌(MBQ)% Loop over mini-batches尽管hasdata(mbq) iteration = iteration + 1; [dlX,dlY1,dlY2] = next(mbq);%使用DLFEVAL评估模型梯度,状态和损失% modelGradients function.[渐变,状态,损失] = dlfeval(@modelgradients,dlnet,dlx,dly1,dly2);dlnet.state = state;% Update the network parameters using the Adam optimizer.[dlnet,trailingavg,trailingavgsq] = adamupdate(dlnet,渐变,。。。trailingavg,trailingavgsq,迭代);%显示培训进度。如果绘图==“训练过程”d =持续时间(0,0,toc(start),'Format',,,,'hh:mm:ss');addpoints(lineLossTrain,iteration,double(gather(extractdata(loss)))) title("Epoch: "+ epoch +“,经过:”+字符串(d))drawnow结尾结尾结尾

モデルのテスト

真のラベルと角度をもつテスト セットで予測を比較して、モデルの分類精度をテストします。学習データと同じ設定のMinibatchqueueオブジェクトをて,データセットをし。。。

[XTest,Y1Test,anglesTest] = digitTest4DArrayData; dsXTest = arrayDatastore(XTest,“迭代饮食”,4);dsYTest = arrayDatastore(Y1Test); dsAnglesTest = arrayDatastore(anglesTest); dsTest = combine(dsXTest,dsYTest,dsAnglesTest); mbqTest = minibatchqueue(dsTest,。。。'MiniBatchSize',,,,miniBatchSize,。。。'MiniBatchFcn',@preprocessdata,。。。'MINIBATCHFORMAT',{'SSCB',,,,'',,,,''});

検証データのラベルと角度を予測するために、ミニバッチをループ処理し、関数预测を使用します。予測されたクラスと角度を保存します。予測されたクラスおよび角度を真のクラスおよび角度と比較し、その結果を保存します。

classSpredictions = [];Anglespredictions = [];classCorr = [];anglediff = [];% Loop over mini-batches.尽管hasdata(mbqTest)% Read mini-batch of data.[dlxtest,dly1test,dly2test] = next(mbqtest);% Make predictions using the predict function.[dly1pred,dly2pred] =预测(dlnet,dlxtest,'Outputs',[["softmax"“ FC2”]);% Determine predicted classes.Y1PredBatch = onehotdecode(dlY1Pred,classNames,1); classesPredictions = [classesPredictions Y1PredBatch];%皮肤预测角度Y2PredBatch = extractdata(dlY2Pred); anglesPredictions = [anglesPredictions Y2PredBatch];% Compare predicted and true classesy1test = OneHotDecode(dly1test,classNames,1);classCorr = [classCorr y1predBatch == y1test];% Compare predicted and true anglesangleDiffBatch = Y2PredBatch - dlY2Test; angleDiff = [angleDiff extractdata(gather(angleDiffBatch))];结尾

分類精度を評価します。

accuracy = mean(classCorr)
精度= 0.9814

回帰精度评価します。

angleRMSE = sqrt(mean(angleDiff.^2))
angleRMSE =single7.7431

一部のその予测をし。予测角度赤,正解正解ラベルをを绿でで表示。

idx = randperm(size(XTest,4),9); figure为了i = 1:9子图(3,3,i)i = xtest(:,:,:,:,idx(i));imshow(i)保持sz = size(i,1);offset = sz/2;thetapred = anglespredictions(idx(i));图(偏移*[1-tand(thetapred)1+tand(thetapred)],[sz 0],'r--') thetaValidation = anglesTest(idx(i)); plot(offset*[1-tand(thetaValidation) 1+tand(thetaValidation)],[sz 0],'g--') 抓住离开label = string(classesPredictions(idx(i))); title(“标签: ”+标签)结尾

モデル勾配関数

关数modelGradientsは,dlnetworkオブジェクトdlnet、入力データDLXのミニバッチと対応するターゲットT1およびT2(それぞれラベルを)ををとして学习パラメーターの损失损失の勾配勾配さされたたネットワークネットワークののの状态状态,

功能[gradients,state,loss] = modelGradients(dlnet,dlX,T1,T2) [dlY1,dlY2,state] = forward(dlnet,dlX,'Outputs',[["softmax"“ FC2”]); lossLabels = crossentropy(dlY1,T1); lossAngles = mse(dlY2,T2); loss = lossLabels + 0.1*lossAngles; gradients = dlgradient(loss,dlnet.Learnables);结尾

ミニバッチ前处理关数

关数预处理は,のでデータ前处理します。

  1. cell配列配列イメージを抽出てて数値配列连结ます。。ますますます番目番目ののの次元次元ででででイメージイメージイメージデータ连结连结连结するするするするするによりにより,,,,,,,,,,,番目番目番目番目番目番目番目のの次元次元ががが使用され。

  2. 入力 cell 配列からラベルと角度データを抽出して、それを 2 番目の次元と共に、categorical 配列および数値配列にそれぞれ連結します。

  3. カテゴリカル ラベルを数値配列に one-hot 符号化します。最初の次元への符号化は、ネットワーク出力の形状と一致する符号化された配列を生成します。

功能[X,Y,angle] = preprocessData(XCell,YCell,angleCell)% Extract image data from cell and concatenatex = cat(4,xcell {:});%从细胞和连接酸盐提取标签数据y = cat(2,ycell {:});% Extract angle data from cell and concatenate角= CAT(2,Anglecell {:});% One-hot encode labelsy = onehotencode(y,1);结尾

参考

|||||||||||

关连するトピック