主要内容

상분류를위해잔차신경망훈련시키기

이예제에서는잔차연결을사용하여딥러닝신경망을만들고CIFAR-10데이터에대해훈련시키는방법을보여줍니다。잔차연결은컨벌루션신경망아키텍처에서자주사용되는소입니다。잔차연결을사용하면신경망의기울기흐름이향상되고보다심층의신경망을훈련시킬수있습니다。

많은응용사례에서는계층들의단순한단일시퀀스로구성된하나의신경망만사용해도충분합니다。그러나일부응용사례에서는계층이여러계층으로부터입력값을받아여러계층으로출력값을보낼수있는보다복잡한그래프구조의신경망이필요합니다。이러한유형의신경망을종종dag(유방향비순환그래프)신경망이라부릅니다。잔차신경망(ResNet)은기본신경망계층을우회하는잔차(또는지름길)연결을갖는DAG신경망의일종입니다。잔차연결은출력계층에서신경망의앞쪽계층으로파라미터기울기가보다쉽게전파되도록해주므로보다심층의신경망을훈련시킬수있습니다。이처럼신경망심도가가하면더욱어려운작업에서정확도가높아질수있습니다。

ResNet아키텍처는초기계층,잔차 블록을포함하는스택,마지막계층으로구성됩니다。잔차블록에는다음과같은세가지유형이있습니다。

  • 초기잔차블록-이블록은첫번째스택의시작부분에위치합니다。이예제는병목구성소를사용합니다。때문에이블록은다운샘플링블록과동일한계층을포함하되,첫번째컨벌루션계층에서[1]스트라이드를사용합니다。자세한내용은resnetLayers항목을참조하십시오。

  • ` ` ` `준잔차블록-이블록은각스택에서첫번째다운샘플링잔차블록뒤에옵니다。이블록은각스택마다여러번위치하며활성화크기를유지합니다。

  • 다운샘플링잔차블록-이블록은(첫번째스택을제외하고)각스택마다시작부분에한번씩위치합니다。다운샘플링블록에서첫번째컨벌루션유닛은marketing자2로공간차원을다운샘플링합니다。

각스택마다심도가다를수있습니다。이예제에서는심도가점점감소하는스택을3개사용하여잔차신경망을훈련시킵니다。첫번째스택은심도4、두번째스택은심도3、마지막스택은심도2를갖습니다

각잔차블록에는딥러닝계층이포함됩니다。각블록의계층에대한자세한내용은resnetLayers항목을참조하십시오。

상분류에적합한잔차신경망을만들고훈련시키려면다음단계를따르십시오。

  • resnetLayers함수를사용하여잔차신경망을만듭니다。

  • trainNetwork함수를사용하여신경망을훈련시킵니다。훈련된신경망은DAGNetwork객체가됩니다。

  • 分类预测함수를사용하여새데이터에대해분류와예측을수행합니다。

상분류를위해사전훈련된잔차신경망을불러올수도있습니다。자세한내용은사전훈련된심층신경망항목을참조하십시오。

데이터준비하기

Cifar-10데이터세트를다운로드합니다[1]。이데이터세트에는60000개의상이포함되어있습니다。각각상은크기가32×32픽셀이고3개의색채널(rgb)을갖습니다。데이터세트의크기는175mb입니다。터넷연결에따라다운로드과정에약간의시간이걸릴수있습니다。

Datadir = tempdir;downloadCIFARData (datadir);

Cifar-10훈련및테스트상을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 = augmentedimagedastore (imageSize,XTrain,TTrain,...DataAugmentation = imageAugmenter,...OutputSizeMode =“randcrop”);

신경망아키텍처정의하기

resnetLayers함수를사용하여이데이터세트에적합한잔차신경망을만듭니다。

  • CIFAR-10영상은32×32픽셀이므로초기필터크기는작3을게사용하고초기스트라이드는1을사용합니다。초기필터개수를16으로설정합니다。

  • 신경망의첫번째스택은초기잔차블록으로시작합니다。그뒤에오는각스택은다운샘플링잔차블록으로시작합니다。다운샘플링블록에서첫번째컨벌루션유닛은marketing자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배을만큼줄입니다。검데이터를사용하여Epoch당한번씩신경망을검합니다。

miniBatchSize = 128;learnRate = 0.1*miniBatchSize/128;valFrequency = floor(size(XTrain,4)/miniBatchSize);选项= 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] = category (net,XValidation);validationError = mean(YValPred ~= TValidation);YTrainPred = category (net,XTrain);trainError = mean(YTrainPred ~= TTrain);disp (“训练错误:”+ trainError*100 +“%”
训练误差:3.462%
disp ("验证错误:"+ validationError*100 +“%”
验证错误:9.27%

혼동행렬을플로팅합니다。열및행약을사용하여각클래스의정밀도를시하고다시호출합니다。신경망은고양이와개를가장많이혼동하고있습니다。

图(单位=“归一化”,Position=[0.2 0.2 0.4 0.4]);cm = confusionchart(TValidation,YValPred);厘米。Title =验证数据混淆矩阵;厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”

다음코드를사용하여테스트영상9개의무작위샘플을예측된클래스및해당클래스의확률과함께표시할수있습니다。

figure idx = randperm(size(XValidation,4),9);i = 1:元素个数(idx)次要情节(3 3 i) imshow (XValidation (:,:,:, idx(我)));Prob = num2str(100*max(probs(idx(i),:)),3);(YValPred(idx(i)));标题([predClass +”、“+问题+“%”])结束

참고 문헌

[1]克里哲夫斯基,亚历克斯。“从微小的图像中学习多层特征。”(2009)。https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

[2]何开明,张翔宇,任少卿,孙健。“用于图像识别的深度剩余学习。”在IEEE计算机视觉和模式识别会议论文集,第770-778页。2016.

참고 항목

|||||

관련 항목