主要内容

。

モデル关节を使を使ネットワーク学习

この例では,層グラフまたはdlnetwork.ではなく关节ををネットワークネットワークネットワークしし习习をを明します。关灯します。关键の使には,幅広いネットワークを记述柔软性得とという点がありはははははははははは。をを行し,データを慎重に设备ししことです。このこの例で,手书架数码のと,数码字分类类垂直位置からの数码の角度判定双各资料的关键词。

学习データの読み込み

関数digittrain4darraydata.はイメージとその数字ラベル,および垂直方向からの回転角度を読み込みます。イメージ,ラベル,角度についてArrayDataStore.オブジェクトを作用成してから,关联结合をの学院データを含む一の,クラスと,とと,离散でない応答の。

[XTrain, YTrain anglesTrain] = digitTrain4DArrayData;dsXTrain = arrayDatastore (XTrain,“IterationDimension”4);dsytrain = ArrayDataStore(Ytrain);dsanglestrain = ArrayDataStore(Anglestrain);dstrain =组合(Dsxtrain,Dstrain,dsanglestrain);ClassNames =类别(Ytrain);numclasses = numel(classnames);numreponses = size(anglestrain,2);numobservations = numel(ytrain);

学習データからの一部のイメージを表示します。

idx = randperm(numobservations,64);i = imtile(xtrain(:::,:,idx));图imshow(i)

深层学习モデルの定义

ラベルと回転角度のの予测する次のををししますしします。

  • 16個の5 x 5フィルターをもつconvolution-batchnorm-ReLUブロック

  • 各ブロックに32个の3 x 3フィルターがあり,间にrelu演算を,2个の卷积 - Batchnormブロックブロック分享

  • 32个の1 x 1の畳み込みを卷卷积 - Batchnormブロックブロックのあるスキップ

  • 加算とそれに続くReLU演算を使用した両方の分岐の組み合わせ

  • 回帰回帰力用作に,サイズが1(応答数)の全全合并演算を分享

  • 分享到力用作,サイズが10(クラス数)の全结合演算とマックス演算をもつ分享

モデルモデルのパラメーターとと状态状态定义定义初初

各演算ののパラメーターパラメーターを定义て体に含めます。parameters.OperationName.ParameterNameの形式を使使使用します。ここここ,参数は构造体,operationNameは演算名(conv1など),ParameterNameはパラメーター名(“权重”など)です。

モデルパラメーターを含む構造体参数を作物成します。サンプル关流initializeGlorotおよびinitializeZerosを使用して,学習可能な層の重みとバイアスをそれぞれ初期化します。サンプル関数initializeZerosおよびinitializeOnesをを使し,バッチ正式化オフセットとパラメーターをそれぞれそれぞれします。

バッチ正規化層を使用して学習や推論を実行するには,ネットワークの状態も管理しなければなりません。予測の前に,学習データから派生するデータセットの平均と分散を指定しなければなりません。状態パラメーターを含む構造体状态を作物成し。バッチ正式化の统计値は,dlarrayオブジェクトにしないでください。関数0および那些をを使,バッチ正态化学学习済み平等と习习済みののの状态状态それぞれ散のの状态状态散散しし

このこの初サンプルは,この例にサポートとして添付さています。

最初の畳み込み層のパラメーターを初期化します。

filterSize = [5 5];numChannels = 1;numFilters = 16;sz = [filterSize numChannels numFilters];numOut = prod(filterSize) * numFilters;numIn = prod(filterSize) * numFilters;parameters.conv1。重量= initializeGlorot(深圳、numOut numIn);parameters.conv1。Bias = initializeZeros([numFilters 1]);

最初のバッチ正規化層のパラメーターと状態を初期化します。

参数.batchnorm1.offset = initializezeros([numfilters 1]);参数.batchnorm1.scale = initialize([numfilters 1]);state.batchnorm1.trainmean = zeros(numfilters,1,'单身的');state.batchnorm1.trountvariance = in(numfilters,1,'单身的');

2番目の畳み込み層のパラメーターを初期化します。

filtersize = [3 3];numchannels = 16;numfilters = 32;sz = [filterSize numChannels numFilters];numOut = prod(filterSize) * numFilters;numIn = prod(filterSize) * numFilters;参数.conv2.weights = initializeglorot(sz,numout,numin);参数.conv2.bias = initializezeros([numfilters 1]);

2番目のバッチ正規化層のパラメーターと状態を初期化します。

parameters.batchnorm2。Offset = initializeZeros([numFilters 1]);parameters.batchnorm2。Scale = initializeOnes([numFilters 1]);state.batchnorm2。TrainedMean = 0 (numFilters 1'单身的');state.batchnorm2。TrainedVariance = 1 (numFilters 1'单身的');

3番目番目の畳み込み层のパラメーターをしし。

filtersize = [3 3];numchannels = 32;numfilters = 32;sz = [filterSize numChannels numFilters];numOut = prod(filterSize) * numFilters;numIn = prod(filterSize) * numFilters;参数.conv3.weights = initializeglorot(sz,numout,numin);参数.conv3.bias = initializezeros([numfilters 1]);

3番目のバッチ正式化层のパラメーターととをます。

参数.batchnorm3.offset = initializezeros([numfilters 1]);parameters.batchnorm3.scale = initialize([numfilters 1]);State.batchnorm3.troundmean =零(numfilters,1,'单身的');state.batchnorm3.troundvariance = =(numfilters,1,'单身的');

スキップ接続における畳み込み層のパラメーターを初期化します。

filtersize = [1 1];numchannels = 16;numfilters = 32;sz = [filterSize numChannels numFilters];numOut = prod(filterSize) * numFilters;numIn = prod(filterSize) * numFilters;参数.convskip.weights = initializeglorot(sz,numout,numin);parameters.convskip.bias = nigitizezeros([numfilters 1]);

スキップ接続におけるバッチ正規化層のパラメーターと状態を初期化します。

parameters.batchnormSkip.Offset = initializeZeros([numFilters 1]);parameters.batchnormSkip.Scale = initializeOnes([numFilters 1]);state.batchnormSkip.TrainedMean = 0 ([numFilters 1],'单身的');state.batchnormSkip.TrainedVariance = ones([numFilters 1],'单身的');

分别介绍了全全层层层层全层层全を层层をををを。

sz = [numClasses 6272]; / / / /numOut = numClasses;numIn = 6272;parameters.fc1。重量= initializeGlorot(深圳、numOut numIn);parameters.fc1。Bias = initializeZeros([numClasses 1]);

回帰回帰力に対応する全层层层层をを层层します。

sz = [numreponses 6272];numout = numreponses;numIn = 6272;参数.fc2.weights = initializeglorot(sz,numout,numin);参数.fc2.bias = initializezeros([numreponses 1]);

パラメーターの構造体を表示します。

参数
参数=结构体字段:Conv1:[1×1结构] Batchnorm1:[1×1结构] Conv2:[1×1结构] Batchnorm2:[1×1结构] Conv3:[1×1结构] Bathnorm3:[1×1 struct] convskip:[1×1结构] Batchnormskip:[1×1结构] FC1:[1×1结构] FC2:[1×1结构]

演算“conv1のパラメーターを表示します。

parameters.conv1
ans =结构体字段:重量:[5×5×1×16 dlarray]偏置:[16×1 dlarray]

状态の构造体を表示します。

状态
州=结构体字段:[1×1 struct] batchnorm2: [1×1 struct] batchnorm3: [1×1 struct] batchnormSkip: [1×1 struct]

演算“batchnorm1の状態パラメーターを表示します。

state.batchnorm1
ans =结构体字段:TrainedMean: [16×1 single] TrainedVariance: [16×1 single]

モデルの関数の定義

この例の最后ににされている,前に说明した习习モデルの力を计算する关联模型を作物成し。

関数模型は,モデルパラメーター参数,入力データdlX,モデルが学习と予测のどちらのの力を返すべきか指定するするフラグdoTraining,およびネットワークの状態状态をを受け取ります予测ははラベルの,角度の予测,およびおよび更更更れたの状态を出しししネットワークの状态をを出し

モデル勾配关键词

例の最后にリストさているいる关联MapicalGRADENTERS.を作物成し。この关键,モデルのパラメーター,ならびにならびに力データdlXののミニバッチととそれにするするT1.およびT2.(それぞれラベルと角度を含む)をを,学校可なパラメーターについてのの勾配,更新されたネットワーク,およびおよびする损失を返します。

学习オプションの指定

学习オプションを指定します。ミニバッチサイズを128として20エポック习习させます。

numepochs = 20;minibatchsize = 128;

学习の进行状况を监视には,それぞれそれぞれの反复の后でで习の损失をプロットできますます含む含む変プロットプロット作作作作作作作作者师语习の行状况プロットプロットしないないないはははは场はは,この値値“无”に设定します。

情节=“培训 - 进展”

モデルの学习

小公子をを使て,イメージイメージのミニバッチをををおよびしししいいいいいしししいいい

  • カスタムカスタム前经理关联preprocessMiniBatch(この例の最后に定义)をを使し,クラスラベルを单热度符ます。

  • イメージデータを次元ラベル'SSCB'(空间,空间,频道,批量)で书签设定します。既定既定で,小公子オブジェクトは,基于なる型が单身的dlarrayオブジェクトにデータを変换ます。书籍をクラスラベルまたは角度角度加しないでください。

  • GPUが利用できる料,GPUで学习を行。既定では,小公子オブジェクトは,GPUが利用可能料,各各力をGPUArray.ににします.gpuをを使するは,并行计算工具箱™,および计算能力3.0以上のcuda®対応nvidia®gpuが必要です。

MBQ = Minibatchqueue(Dstrain,......'minibatchsize',小匹马,......'minibatchfcn',@preprocessminibatch,......'minibatchformat',{'SSCB'''''});

各が终了するに回しし终了するに,学校习进にを表示ししますししますししますますますしししししますしししししししししししします表示し表示しししししししししししししししししししししししししししししししししししししし요한

  • 関数dlfeval.およびMapicalGRADENTERS.をを用してモデルの勾配损失损失を评価。

  • 関数adamupdate.をを用してネットワークパラメーターを新します。

亚当用にパラメーターを初期化します。

trailingAvg = [];trailingAvgSq = [];

学科の进行状况プロットプロットをしします。

如果plots ==“培训 - 进展”图lineloSstrain =动画线('颜色'[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel(“损失”) 网格结束

モデルに学习させます。

迭代= 0;start = tic;%循环epochs。epoch = 1:numepochs%洗牌数据。洗牌(兆贝可)%循环在迷你批次尽管Hasdata(MBQ)迭代=迭代+ 1;[DLX,DLY1,DLY2] =下一个(MBQ);%评估模型渐变,状态和使用DLFeval和丢失%MACEMEGRADENTERS功能。[梯度,状态,损失] = DLFeval(@Modelgradients,参数,DLX,DLY1,DLY2,状态);%使用ADAM Optimizer更新网络参数。[参数,trailingavg,trailingavgsq] = adamupdate(参数,渐变,......trailingavg,trailingavgsq,迭代);%显示训练进度。如果plots ==“培训 - 进展”d =持续时间(0,0,toc(start),'格式''hh:mm:ss');Addpoints(LineLoStrain,迭代,Double(收集(提取数据(丢失))))标题(“时代:”+时代+”,过去:“+字符串(d))绘制结束结束结束

モデルのテスト

真のラベルと角度をテストセットででを比较して,モデルの分享精选をテストししししします设定设定设定しししし小公子オブジェクトを使用して,テストデータセットを管理します。

[XTest,欧美,anglesTest] = digitTest4DArrayData;dsXTest = arrayDatastore (XTest,“IterationDimension”4);dsytest = ArrayDataStore(Yest);dsanglestest = ArrayDataStore(Anglestest);DSTEST =联合(DSXTEST,DSYTEST,DSANGLESTEST);mbqtest = minibatchqueue(dstest,......'minibatchsize',小匹马,......'minibatchfcn',@preprocessminibatch,......'minibatchformat',{'SSCB'''''});

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

dotraining = false;classespredictions = [];AnglesPredictions = [];classcorr = [];anglediff = [];%循环在迷你批次。尽管Hasdata(MBQTEST)%读取迷你批次数据。[DLXTEST,DLY1TEST,DLY2TEST] =下一个(MBQTEST);%使用预测功能进行预测。[dlY1Pred, dlY2Pred] =模型(参数、dlXTest doTraining、状态);%确定预测的类。y1predbatch = onehotdecode(dly1pred,classnames,1);classespredictions = [classespricictions y1predbatch];Dermine预测角度y2predbatch =提取数据(dly2pred);anglespredictions = [anglespredictions y2predbatch];%比较预测和真实课程Y1Test = onehotdecode (dlY1Test一会1);classCorr = [classCorr Y1PredBatch == Y1Test];%比较预测和真正的角度anglediffbatch = y2predbatch  -  dly2test;Anglediff = [Anglediff ExtractData(聚集(anglediffbatch))];结束

分享精灵を评価ます。

精度=均值(ClassCorr)
精度= 0.9730.

回帰精度を評価します。

Anglermse = SQRT(平均(Anglediff。^ 2))
anglermse =单身的6.6909

一道のイメージと,その予测を表示し。予测角度を赤,正解ラベルをででします。

IDX = RANDPERM(大小(XTEST,4),9);数字i = 1:9子图(3,3,i)i = xtest(:,::,Idx(i));imshow(i)持有sz =尺寸(i,1);offset = sz / 2;TheTapred = AnglesPredictions(IDX(i));绘图(偏移* [1-TAND(THETAPRED)1 + TAND(THETAPRED)],[SZ 0],'r--')ThetAvalidation = Anglyest(IDX(I));绘图(偏移* [1-TAND(TOTAVATHATION)1 + TAND(THETAV alation)],[SZ 0],'G - ') 抓住离开label = string(classesepredictions(idx(i)));标题(”的标签:“+标签)结束

モデル関数

関数模型は,モデルパラメーター参数,入力データdlX,モデルが学习と予测のどちらのの力を返すべきか指定するするフラグdoTraining,およびネットワークの状態状态をを受け取ります予测ははラベルの,角度の予测,およびおよび更更更れたの状态を出しししネットワークの状态をを出し

功能[dlY1、dlY2] =模型(参数、dlX doTraining,状态)%卷积重量= parameters.conv1.Weights;偏见= parameters.conv1.Bias;海底= dlconv (dlX、权重、偏见,'填充''相同的');%批量标准化,relu抵消= parameters.batchnorm1.Offset;规模= parameters.batchnorm1.Scale;trainedMean = state.batchnorm1.TrainedMean;trainedVariance = state.batchnorm1.TrainedVariance;如果达到[DLY,训练有兵,训练] = Batchnorm(DLY,偏移,刻度,训练有谋,训练variance);%更新状态State.batchnorm1.trountmean =训练有素;State.batchnorm1.tratoredvariance =训练variance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束海底= relu(海底);%卷积,批量标准化(跳过连接)重量= parameters.convSkip.Weights;偏见= parameters.convSkip.Bias;dlYSkip = dlconv(海底,重量、偏见,“步”2);offset = parameters.batchnormskip.offset;scale = parameters.batchnormskip.scale;受过训练的训练= state.batchnormskip.troundmean;troustainvariance = state.batchnormskip.troundvariance;如果dotRaining [Dlyskip,训练有兵,训练审查] = Batchnorm(Dlyskip,偏移,刻度,训练师,训练variance);%更新状态state.batchnormSkip.TrainedMean = trainedMean;state.batchnormSkip.TrainedVariance = trainedVariance;其他的Dlyskip = Batchnorm(Dlyskip,偏移,规模,训练师,训练variance);结束%卷积重量= parameters.conv2.Weights;偏见= parameters.conv2.Bias;海底= dlconv(海底,重量、偏见,'填充''相同的'“步”2);%批量标准化,relu抵消= parameters.batchnorm2.Offset;规模= parameters.batchnorm2.Scale;trainedMean = state.batchnorm2.TrainedMean;trainedVariance = state.batchnorm2.TrainedVariance;如果达到[DLY,训练有兵,训练] = Batchnorm(DLY,偏移,刻度,训练有谋,训练variance);%更新状态State.batchnorm2.trountmean =训练有素;State.batchnorm2.trountavariance =训练variance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束海底= relu(海底);%卷积权重= parameters.conv3.weights;bias = parameters.conv3.bias;海底= dlconv(海底,重量、偏见,'填充''相同的');%批量归一化offset = parameters.batchnorm3.offset;scale = parameters.batchnorm3.scale;受过训练的训练= state.batchnorm3.trainedmean;TroughtVariance = State.batchnorm3.TrountaInvaniance;如果达到[DLY,训练有兵,训练] = Batchnorm(DLY,偏移,刻度,训练有谋,训练variance);%更新状态State.batchnorm3.troundmean =训练有素;State.batchnorm3.trountvariance =训练variance;其他的海底= batchnorm(海底、抵消、规模、trainedMean trainedVariance);结束%加法,reludly = dlyskip + dly;海底= relu(海底);%完全连接,softmax(标签)权重=参数.fc1.weights;bias = parameters.fc1.bias;dly1 =全协调(DLY,重量,偏见);dly1 = softmax(dly1);%完全连接(角度)权重= parameters.fc2.weights;bias = parameters.fc2.bias;dly2 =全协调(DLY,重量,偏见);结束

モデル勾配关节

関数MapicalGRADENTERS.は,モデルパラメーター,入力データdlXののミニバッチととそれにするするT1.およびT2.(それぞれラベルと角度を含む)をを,学校可なパラメーターについてのの勾配,更新されたネットワーク,およびおよびする损失を返します。

功能[梯度,状态,损失] = MaposGRADENTERS(参数,DLX,T1,T2,状态)dotraining = true;[Dly1,Dly2,状态] =模型(参数,DLX,dotraining,状态);LODELABELS =联语转基金(DLY1,T1);LOTINGANGLES = MSE(DLY2,T2);损失=损失标签+ 0.1 *损失;梯度= Dlgradient(损失,参数);结束

ミニバッチ前処理関数

関数preprocessMiniBatchは,次の手順でデータを前処理します。

  1. 入力电池配列からイメージデータを抽出して数値配列に連結します。4番目の次元でイメージデータを連結することにより,3番目の次元が各イメージに追加されます。この次元は,シングルトンチャネル次元として使用されます。

  2. 入力细胞配列からラベルと角度を抽出して,それを2番目のと共に,分类配列および数据配列に连结します。

  3. カテゴリカルラベルを数码配列にに符符化符し。最初最初の次元へのの,ネットワークネットワーク力のととする符符化生成します。

功能[x,y,角度] = preprocessminibatch(xcell,ycell,anglecell)%从单元格和连接中提取图像数据猫(X = 4,伊势亚{:});%从单元格中提取标签数据并连接Y =猫(2,YCell {:});%提取来自单元格的角度数据并连接角=猫(2,angleCell {:});%单热量编码标签y = onehotencode(y,1);结束

参考

||||||||||||

関連するトピック