。
この例では,テスト精度の向上のためにスナップスナップのアンサンブルスケジュールし,オブジェクトのイメージをするようネットワークに习させるする示しネットワーク习ささせるを示します。スケジュール习取得しモデルのショットを取得化アンサンブルショットー习ししますを习します。
このこのは,カスタムカスタム期学习率率率使,cifar-10データセット[2]で残差ネットワーク[1]に习习せます。それぞれそれぞれの反复,ソルバーので,ソルバーはシフトした余弦关键[3]α(t)=(alpha0 / 2)* cos(pi * mod(t-1,t / m)/(t / m)+1)
によってによってられる学习率率使使ます。ここここ,T.
は反复数,T.
は学习反复の数,alpha0.
はは期学院,m
は周周ショットの。この学习率は,学校プロセスをm
个个の周に效果ししししし各各周は単调にで始まりきなににさまざま率で始まりきな値にさまざまな的せ各値をサイクルの最后せに値习サイクルの最后ににます値をサイクルの最后にに値习サイクルの最后にに値値サイクルのの最后に(つまり,その反复におけるモデルを保存し,その后,すべてのスナップショットモデル予测を平面(スナップスナップ[4]とも呼ばれます)しし,最终呼ばれ度をしせます。
cifar-10データセット[2]をダウンロードします。このデータセットには60,000个のイメージが格式されのサイズいますいいいははははははははははいはははいははははははははははいいはいいははいははははははははははははははいいはははははいははいははははサイズは175 MBです。インターネット接続の速度によって,ダウンロードプロセスに时间がかかることあります。
datadir = tempdir;downloadcardata(datadir);
cifar-10学院イメージイメージテストイメージをををををを4次元配列として読み込みます。学校セットには50,000个のイメージが格式さていて,テストセットにて10,000个のイメージが格式されいます。
[xtrain,ytrain,xtest,ytest] = loadcifardata(Datadir);Classes =类别(YTrain);numclasses = numel(类);
次次コードを使使,ランダムランダムにサンプリングされたた习イメージを表示できでき
数字;IDX = RANDPERM(大小(XTRAIN,4),20);IM = IMTILE(XTrain(::::,idx),'thumbnailsize',[96,96]);imshow(IM)
ネットワーク学习に使使用するAugmentedimageGedataStore.
オブジェクトを作品成します。学习中に,データストアは縦轴に沿っ习习イメージををランダムに反転させせせ向向および向に大4ピクセル最ランダムランダムランダムますだけせせせせせせせせせせせでせでで复合が生长したり,学院イメージイメージ正确なが记忆されたりことを
图像_ [32 32 3];PIXELRANGE = [-4 4];imageaugmenter = imagedataAugmenter(......'randxreflection',真的,......'randxtranslation',pixelrange,......'randytranslation',pixelrange);Augimdstrain = AugmentedimageGetaTore(图像化,XTrain,Ytrain,......'dataaugmentation',imageaugmender);
6つの标准畳み込みユニット(段阶ごとに2ユニット)があり,幅が16の残差ネットワーク[1]を作用成します。ネットワークの深さのは2 * 6 + 2 = 14です。さらに,イメージイメージ力层で'吝啬的'
オプションオプションを用しし平等イメージをを指定ししますますますます。
NetWidth = 16;图层= [imageInputLayer(图像化,'名称'那'输入'那'吝啬的',平均(XTrain,4))卷积2dlayer(3,NetWidth,'填充'那'相同的'那'名称'那'召集'batchnormalizationlayer('名称'那'bninp')剥离('名称'那'reluinp')卷大池(NetWidth,1,'s1u1')附加层(2,'名称'那'Add11')剥离('名称'那'relu11')卷大池(NetWidth,1,'s1u2')附加层(2,'名称'那'Add 12')剥离('名称'那'relu12')卷积帆船(2 * NetWidth,2,'s2u1')附加层(2,'名称'那'Add21')剥离('名称'那'relu21')卷大钢筋(2 * NetWidth,1,'s2u2')附加层(2,'名称'那'Add22')剥离('名称'那'relu22')卷积帆船(4 * NetWidth,2,'s3u1')附加层(2,'名称'那'Add31')剥离('名称'那'relu31')卷大钢筋(4 * NetWidth,1,'s3u2')附加层(2,'名称'那'Add32')剥离('名称'那'relu32')普通Pooling2dlayer(8,'名称'那'globalpool')全连接层(10,'名称'那'fcfinal')];Lgraph = LayerGraph(层);Lgraph = ConnectLayers(LAPHAGE,'reluinp'那'Add11 / In2');Lgraph = ConnectLayers(LAPHAGE,'relu11'那'Add12 / In2');skip1 = [康波署2dlayer(1,2 * netwidth,'走吧'2,'名称'那'skipconv1'batchnormalizationlayer('名称'那'skipbn1')];Lgraph = Addlayers(LGraph,Skip1);Lgraph = ConnectLayers(LAPHAGE,'relu12'那'skipconv1');Lgraph = ConnectLayers(LAPHAGE,'skipbn1'那'Add21 / In2');Lgraph = ConnectLayers(LAPHAGE,'relu21'那'Add22 / In2');Skip2 = [康波署2dlayer(1,4 * NetWidth,'走吧'2,'名称'那'skipconv2'batchnormalizationlayer('名称'那'skipbn2')];Lgraph = Addlayers(LGraph,Skip2);Lgraph = ConnectLayers(LAPHAGE,'relu22'那'skipconv2');Lgraph = ConnectLayers(LAPHAGE,'skipbn2'那'Add31 / In2');Lgraph = ConnectLayers(LAPHAGE,'relu31'那'Add32 / In2');
resnetアーキテクチャアーキテクチャをプロットしし。
数字;图(LGROPL)
层グラフからdlnetwork.
オブジェクトを作物成し。
dlnet = dlnetwork(3);
例例の最后ににリストされている关词MapicalGRADENTERS.
を作用成し。この关圈,dlnetwork.
オブジェクトDLNET.
,およびおよび力データDLX.
ののミニバッチととそれにするするy,
を受け取り,DLNET.
における学习可なパラメーターについての损失の勾配を返します。また,この关键,特点のの反复におけるのと习もパラメーターののとも返し
学习オプションを指定します。ミニバッチサイズを64として20エポック习习させ。
numepochs = 200;minibatchsize = 64;numobservations = numel(ytrain);速度= [];动量= 0.9;掌权= 1E-4;
周期学院习率にの习习オプションを指定し。alpha0.
はは期学院,numsnapshots.
は寿期数量学院中に取得したスナップショットショット数です。
alpha0 = 0.1;numsnapshots = 5;epochspersnapshot = numepoch./numsnapshots;iterationspersnapshot = ceil(numobservations./minibatchsize)* numochs。/ numsnapshots;ModelPrefix =.“snapshotepoch”;
学科の进行状况ををに可化ます。
plots =.“培训 - 进展”;
学科图をををますます。
如果plots ==.“培训 - 进展”[损失,学习林] = plotlossandlearnrate();结尾
小公子
をを使ににのバッチミニバッチでを行。
カスタムカスタム前经理关联Preprocessminibatch.
(この例の最后に定义)をを使し,クラスラベルを单热度符ます。
イメージデータを次元ラベル'SSCB'
(空间,空间,频道,批量)で书签设定します。既定既定で,小公子
オブジェクトは,基于なる型が单身的
のdlarray.
オブジェクトにデータを変换します。书籍ををクラスラベルラベルににないでででないないで
GPUが利用できる料,GPUで学习を行。既定では,小公子
オブジェクトは,GPUが利用可能料,各各力をGPUArray.
ににします.gpuをを使するは,并行计算工具箱™,および计算能力3.0以上のcuda®対応nvidia®gpuが必要です。
augimdstrain.minibatchsize =小匹匹匹匹匹蒂斯;Mbqtrain = Minibatchqueue(Augimdstrain,......'minibatchsize',小匹马,......'minibatchfcn',@preprocessminibatch,......'minibatchformat',{'SSCB'那''});
カスタム学习ループを使使ててに学习习せます。各各について,データストアをし,データのミニバッチループループ处处,在のてがepochspersnapshot.
のエポックのに,学校习进に。
关节dlfeval.
およびMapicalGRADENTERS.
をを用してモデルの勾配损失损失を评価。
ネットワークの学习不锈钢パラメーターの状态を新。
周期学院习率スケジュール习习を决定。
关节sgdmupdate.
を使用してネットワークパラメーターを更新します。
各各反复でのの损失と习率を
この例では,nvidia™titan rtxでの学习に约14时间かかりかかりた。
迭代= 0;start = tic;%循环epochs。为了epoch = 1:numepochs%Shuffle数据。洗牌(MBQTrain);%保存快照模型。如果〜mod(epochspersnapshot)保存(modelprefix + epoch +“。垫”那'dlnet');结尾%循环在迷你批次。尽管Hasdata(MBQTrain)迭代=迭代+ 1;%读取迷你批次数据。[DLX,DLY] =下一个(MBQTrain);%使用dlfeval和dlfeval评估模型渐变和损失%MACEMEGRADENTERS功能。[渐变,损失,状态] = DLFeval(@ Maposgradients,Dlnet,DLX,DLY,举重);%更新非可爱参数的状态。dlnet.state = state;%确定周期学习率计划的学习率。snownrate = 0.5 * alpha0 *(cos((pi * mod(迭代-1,iterationspersnapshot)./ iterationspersnapshot))+ 1);%使用SGDM Optimizer更新网络参数。[dlnet.Learnables,速度] = SGDMUPDATE(DLNET.LEARNABLE,梯度,速度,学习,动量);%显示培训进度。如果plots ==.“培训 - 进展”d =持续时间(0,0,toc(start),'格式'那'hh:mm:ss');addpoints(lockline,reateration,double(收集(提取数据(丢失))))addpoints(Snownroateline,迭代,学习);sgtitle(“时代:”+ epoch +“,经过:”+字符串(d))绘制结尾结尾结尾
学习中に取得取得しネットワークのののスナップショットををして,最终モデルは度をテストますアンサンブルは,m个の独立したモデルのの全结しモデルすべてのの力の平衡に対応します。
cifar-10データセットでされるテストデータでモデルをします。学习データデータと同じ设定テストデータと同じ设定小公子
オブジェクトを使使て,テストデータセットセット管理しし。
augimdstest = augmentedimageageataStore(图像,xtest,ytest);Augimdstest.minibatchsize =小匹匹匹匹配;MBQTEST = MINIBATCHQUEUE(AUGIMDSTEST,......'minibatchsize',小匹马,......'minibatchfcn',@preprocessminibatch,......'minibatchformat',{'SSCB'那''});
各スナップショットネットワークの精密をを评価しし定义てて终わり定义定义て关键词模特预分规
ををデータし,テストデータセット内のすべてデータを反复反复反复ししデータデータは,モデルからの全结层の力,予测されクラス,およびおよび真のクラスとクラス比较返し
modelname = cell(numsnapshots + 1,1);fcoutput = zeros(numcrasses,numel(ytest),numsnapshots + 1);classpredictions = cell(1,numsnapshots + 1);ModelAccuracy = Zeros(Numsnapshots + 1,1);为了m = 1:numsnapshots modelname {m} = modelprefix + m * epochspersnapshot;load(modelname {m} +“。垫”);重置(MBQTEST);[fcoutputtest,classpredtest,classcorrtest] = ModelPredictions(DLNET,MBQTEST,类);fcOutput(:,:,m)= fcoutputtest;classpricictions {m} = classpredttest;modelAccuracy(m)= 100 *平均值(典型刺耳);disp(modelname {m} +“ 准确性: ”+ modelAccuracy(m)+“%”)结尾
SNAPSHOTEPOCH40精度:88.35%Snapshotepoch80精度:89.93%Snapshotepoch120精度:90.51%Snapshotepoch160精度:90.33%Snapshotepoch200精度:90.63%
アンサンブルネットワークの出力量をするには,各スナップショットネットワークの全出出の均计算しますます。关键词onehotdecode.
をされたをネットワークさとます。
FcOutput(:,:,结束)=均值(fcOutput(::,:,1:结束-1),3);classpricictions {end} = onehotdecode(softmax(fcoutput(:,exp)),classes,1,'分类');classcorrensemble = classpredictions {end} == ytest';ModelAccuracy(END)= 100 *平均值(分类别);ModelName {END} =“合奏模型”;DISP(“合奏准确性:”+ ModelAccuracy(END)+“%”)
合奏精度:91.59%
テストテストデータセットに対するすべてすべてスナップショットモデルとアンサンブルモデルの度度をプロットプロットし
图;酒吧(ModelAccuracy);ylabel('准确性 (%)');xticklabels(modelname)xtickangle(45)标题('模型准确性')
关节MapicalGRADENTERS.
は,dlnetwork.
オブジェクトDLNET.
,入力データのミニバッチDLX.
,ラベルy,
,および重み减衰のパラメーターをますます。この关键,勾配,损失,および学习不合物なパラメーター状态ます。勾配勾配自动的に计算には。Dlgradient.
を使用します。
功能[渐变,损失,状态] = MapeStrients(DLNET,DLX,Y,权力)[Dlypred,状态] =前进(DLNET,DLX);Dlypry = softmax(dlypred);损失=联肾上腺素(Dlypred,Y);%L2-正则化(重量衰减)allparams = dlnet.learnables(dlnet.learnables.parameter ==“重量”|dlnet.learnables.parameter ==.“规模”,:)。价值;l2norm = cellfun(@(x)sum(x。^ 2,'全部'),allparams,'统一输出',错误的);l2norm = sum(cat(1,l2norm {:}));损失=损失+砝码* 0.5 * l2norm;梯度= DLGRADIET(损失,DLNET.LEALNABLE);结尾
关节模特预分规
は,入力としてdlnetwork.
オブジェクトDLNET.
とと力量MBQ.
の小公子
を受け取り,小公子
このすべてののデータを反复することでモデル予测を计算しししししし。关键词onehotdecode.
をを使し,スコアが最も高い予测れたを见つけ,その予测を真のクラス比较ます。この关し,ネットワークネットワーク,ネットワークネットワーク力,クラス,および予测予测正误を0と1のを返します。
功能[RawPredictions,ClassPrictictions,ClassCorr] = ModelPredictions(DLNET,MBQ,类)RAWPREDITIONS = [];classpricictions = [];classcorr = [];尽管Hasdata(MBQ)[DLX,DLY] =下一个(MBQ);% 作出预测dlypred =预测(Dlnet,DLX);RawPredictions = [RawPredictions提取数据(收集(Dlypred))];%将网络输出转换为概率并确定预测%班级Dlypry = softmax(dlypred);ypredbatch = onehotdecode(dlypred,classes,1);classpredictions = [classpricictions ypredbatch];%比较预测和真实课程y = onehotdecode(dly,classes,1);classcorr = [classcorr ypredbatch == y];结尾结尾
关节Plotlossandlearnrate.
は,学院中の各反复で损失と习率表示するためにをを
功能[损失线,snowraateline] = plotlossandlearnrate()图子图(2,1,1);损失=动画线('颜色',[0.85 0.325 0.098]);标题('失利');Xlabel('迭代')ylabel('失利') 网格上子图(2,1,2);sewnroateline =动画线条('颜色',[0 0.447 0.741]);标题('学习率');Xlabel('迭代')ylabel('学习率') 网格上结尾
关节卷积(numf,stride,标签)
は2つの畳み込み层と対応する正式化层およびおよび层层ののある层配列作用numf.
は畳み込みフィルターの数。步行
は最初の畳み込み层のストライドストライドで,标签
はすべての层の名称の先头にに追れるタグです。
功能图层=卷积器(numf,stride,标签)图层= [卷积2dlayer(3,numf,'填充'那'相同的'那'走吧',步幅,'名称',[标签,'conv1'])BatchnormalizationLayer('名称',[标签,'bn1'])剥离('名称',[标签,'relu1'])卷积2dlayer(3,numf,'填充'那'相同的'那'名称',[标签,'conv2'])BatchnormalizationLayer('名称',[标签,'bn2'])];结尾
关节Preprocessminibatch.
は,次次の手顺でデータを前前处ししし
入力细胞配列からイメージデータを抽出し数码配列に连结ますます次元イメージデータデータすることによりデータをするにより各イメージイメージされますイメージこのさます。使用されます。
入力细胞配列からラベルデータをし,2番目の次元にて分类配列配列连结させます。
カテゴリカルラベルを数码配列にに符符化符し。最初最初の次元へのの,ネットワークネットワーク力のととする符符化生成します。
功能[x,y] = preprocessminibatch(xcell,ycell)%从单元格和连接中提取图像数据X = CAT(4,Xcell {:});%提取来自细胞和连接的标记数据y =猫(2,Ycell {:});%单热量编码标签y = onehotencode(y,1);结尾
[1]他,Kaiming,湘雅张,少清任,剑孙。“图像识别的深度剩余学习。”在计算机愿景和模式识别的IEEE会议的诉讼程序,pp.770-778。2016年。
[2] Krizhevsky,Alex。“从微小图像学习多层特征。”(2009)。https://www.cs.toronto.edu/~kriz/learning-features-2009-tra.pdf.
[3] Loshchilov,Ilya和Frank Hutth。“SGDR:随机梯度下降,温暖重启。”(2016)。ARXIV预印迹ARXIV:1608.03983。
[4]黄,高,义轩李,杰夫·普雷,庄刘,约翰·艾尔·霍普罗夫特和莱尼Q. Weinberger。“快照合奏:火车1,免费获得M.(2017)。ARXIV预印迹ARXIV:1704.00109。
dlarray.
|dlfeval.
|Dlgradient.
|dlnetwork.
|分层图
|小公子
|onehotdecode.
|onehotencode.
|sgdmupdate.
|sigmoid.