このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
この例はの数字のラベル回転角度を予测予测,,,复数のの出力をもつ深层学习学习ネットワークネットワークにににに学习
复数のあるに学习せるはカスタムループをを使用してネットワークネットワークに学习学习させなけれなければば
关数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
オブジェクトは基となるががsingle
のDlarray
オブジェクトにデータを変換します。書式をクラス ラベルまたは角度に追加しないでください。
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);结尾
关数预处理
は,のでデータ前处理します。
cell配列配列イメージを抽出てて数値配列连结ます。。ますますます番目番目ののの次元次元ででででイメージイメージイメージデータ连结连结连结するするするするするによりにより,,,,,,,,,,,番目番目番目番目番目番目番目のの次元次元ががが使用され。
入力 cell 配列からラベルと角度データを抽出して、それを 2 番目の次元と共に、categorical 配列および数値配列にそれぞれ連結します。
カテゴリカル ラベルを数値配列に 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);结尾
batchnormalizationlayer
|卷积2Dlayer
|Dlarray
|dlfeval
|dlgradient
|完整连接的layerer
|Minibatchqueue
|OneHotDecode
|上ehotencode
|Relulayer
|sgdmupdate
|softmaxLayer