主要内容

이번역페이지는최신내용을담고있지않습니다。최신내용을문으로보려면여기를클릭하십시오。

새로운상을분류하도록딥러닝신경망훈련시키기

이예제에서는새로운영상세트를분류할수있도록전이학습을사용하여컨벌루션신경망을다시훈련시키는방법을보여줍니다。

사전훈련된영상분류신경망은1백만개가넘는영상에대해훈련되었으며영상을키보드,커피머그잔,연필,각종동물등1000가지사물범주로분류할수있습니다。분류신경망은다양한상을대하는다양한특징을학습했습니다。이신경망은영상을입력값으로받아서영상에있는사물에대한레이블과각사물범주의확률을출력합니다。

전이학습은딥러닝응용분야에서널리사용됩니다。사전훈련된신경망을새로운작업을학습하기위한출발점으로사용할수있습니다。일반적으로전이학습으로신경망을미세조정하는것이무작위로초기화된가중치를사용하여신경망을처음부터훈련시키는것보다훨씬쉽고빠릅니다。학습된특징을보다적은개수의훈련영상을사용하여새로운작업으로빠르게전이할수있습니다。

데이터불러오기

새、상의압축을풀고、새、상데이터저장소로불러옵니다。이데이터세트는75개의상만을갖는매우작은데이터세트입니다。데이터를훈련데이터세트와검데이터세트로나눕니다。상의70%를훈련용으로사용하고30%를검용으로사용합니다。

解压缩(“MerchData.zip”);imds = imageDatastore(“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7);

사전훈련된신경망불러오기

사전훈련된GoogLeNet신경망을불러옵니다。深度学习工具箱™模型为GoogLeNet网络지원패키지가설치되어있지않으면이를다운로드할수있는링크가제공됩니다。

사전훈련된다른신경망을사용해보려면MATLAB®에서이예제를연다음다른신경망을선택하십시오。예를들어,googlenet보다 빠른squeezenet신경망을사용해볼수있습니다。사전훈련된다른신경망을사용하여이예제를실행할수있습니다。사용가능한신경망목록은사전훈련된신경망불러오기항목을참조하십시오。

网=googlenet;

analyzeNetwork를사용하여신경망아키텍처에대한대화형방식시각화와신경망계층에대한상세한정보를표시합니다。

analyzeNetwork(净)

신경망의속성의첫번째소는상입력계층입니다。GoogLeNet신경망의경우,이계층에입력되는영상은크기가224×224×3이어야합니다。여기서3은색채널의개수입니다。다른신경망의경우입력상의크기가저마다다를수있습니다。예를들어,Xception신경망의입력상은크기가299×299×3이어야합니다。

net.Layers (1)
ans = ImageInputLayer with properties: Name: 'data' InputSize:[224 224 3]超参数DataAugmentation: 'none'归一化:'zerocenter' NormalizationDimension: 'auto' Mean: [224×224×3 single]
inputSize = net.Layers(1).InputSize;

마지막계층바꾸기

신경망의컨벌루션계층은마지막학습가능한계층과마지막분류계층이입력영상을분류하는데사용하는영상특징을추출합니다。GoogLeNet의두계층“loss3-classifier”“输出”은신경망이추출하는특징을클래스확률,손실값및예측된레이블로조합하는방법에대한정보를포함합니다。사전훈련된신경망을새로운영상을분류하도록다시훈련시키려면이두계층을새데이터세트에맞게조정된새로운계층으로바꾸십시오。

사전훈련된신경망을계층그래프로변환합니다。

lgraph = layerGraph(net);

바꿀두계층의이름을찾습니다。이작업은수동으로할수도있고지원함수findLayersToReplace를사용하여계층을자동으로찾을수도있습니다。

[learnableLayer,classLayer] = findLayersToReplace(lgraph);[learnableLayer, classLayer]
ans = 1×2带有层的层数组:1 'loss3-classifier'全连接1000全连接Layer 2 'output' Classification output crossentropyex与'tench'和999个其他类

대부분의신경망에서,학습가능한가중치를갖는마지막계층은완전연결계층입니다。이완전연결계층을출력값의개수가새데이터세트의클래스개수와같은(이예제에서는5)새로운완전연결계층으로바꿉니다。SqueezeNet과같은일부신경망에서는학습가능한마지막계층은1×1컨벌루션계층이됩니다。이경우컨벌루션계층을필터의개수가클래스개수와같은새로운컨벌루션계층으로바꿉니다。전이된계층보다새로운계층에서더빠르게학습할수있도록하려면계층의학습률인자값을높이십시오。

numClasses = numel(categories(imdsTrain.Labels));如果isa (learnableLayer“nnet.cnn.layer.FullyConnectedLayer”) newLearnableLayer = fullyConnectedLayer(numClasses,...“名字”“new_fc”...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);elseifisa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”) newLearnableLayer = convolution2dLayer(1,numClasses,...“名字”“new_conv”...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);结束lgraph = replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);

분류계층은신경망의출력클래스를지정합니다。분류계층을클래스레이블이없는새로운계층으로바꿉니다。trainNetwork는훈련을진행할때계층의출력클래스를자동으로설정합니다。

newClassLayer = classificationLayer(“名字”“new_classoutput”);lgraph = replaceLayer(lgraph,classLayer.Name,newClassLayer);

새로운계층이올바르게연결되었는지확인하려면새로운계층그래프를플로팅하고신경망의마지막계층을확대하십시오。

图(“单位”“归一化”“位置”,[0.3 0.3 0.4 0.4]);情节(lgraph) ylim ([0, 10])

초기계층고정하기

새로운상세트를사용하여신경망을다시훈련시킬준비가되었습니다。선택적으로신경망의앞쪽계층의학습률을설정하여이전계층의가중치를고정할수있습니다。훈련 중에trainNetwork는고정된계층의파라미터를업데이트하지않습니다。고정된계층의기울기를계산할필요가없으므로전반부에있는여러계층의가중치를고정하면신경망훈련속도를대폭높일수있습니다。새로운데이터세트의크기가작다면이전신경망계층을고정함으로써해당계층이새로운데이터세트에과적합되지않도록할수도있습니다。

계층그래프의계층과연결을추출한다음고정할계층을선택합니다。GoogLeNet에서는처음10개의계층이신경망의초기'줄기'가됩니다。지원 함수freezeWeights를사용하여처음10개계층의학습률을0으로설정합니다。지원 함수createLgraphUsingConnections를사용하여모든계층을원래순서대로다시연결합니다。새로운계층그래프는동일한계층을포함하지만앞쪽계층의학습률이0으로설정되어있습니다。

layers = lgraph.Layers;connections = loggraph . connections;layers(1:10) = freezeWeights(layers(1:10));lgraph = createLgraphUsingConnections(层,连接);

신경망훈련시키기

이신경망의입력영상은크기가224×224×3이어야하는데영상데이터저장소의영상은이와크기가다릅니다。대상데이터저장소를사용하여훈련상의크기를자동으로조정합니다。훈련상에대해추가로수행할대연산을지정합니다。즉,세로축을따라훈련영상을무작위로뒤집고,최대30개의픽셀을최대10%까지가로와세로방향으로무작위로평행이동합니다。데이터증대는신경망이과적합되는것을방지하고훈련영상의정확한세부정보가기억되지않도록하는데도움이됩니다。

pixelRange = [-30 30];scaleRange = [0.9 1.1];imageAugmenter = imageDataAugmenter(...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”pixelRange,...“RandXScale”scaleRange,...“RandYScale”, scaleRange);augimdsTrain = augmentedimagedastore (inputSize(1:2)),imdsTrain,...“DataAugmentation”, imageAugmenter);

추가적인데이터증대를수행하지않고검증영상의크기를자동으로조정하려면증대영상데이터저장소를추가적인전처리연산지정없이사용하십시오。

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

훈련옵션을지정합니다。아직고정되지않은전이된계층의학습을늦추기위해InitialLearnRate를작은값으로설정합니다。이전단계에서는새로운마지막계층에서의학습속도를높이기위해학습가능한마지막계층의학습률인자를증가시켰습니다。이러한조합으로학습률을설정하면새로운계층에서는학습이빨라지고중간계층에서는학습이느려지며고정된앞쪽계층에서는학습이진행되지않습니다。

훈련을진행할纪元의횟수를지정합니다。전이학습을수행할때는많은횟수의纪元에대해훈련을진행하지않아도됩니다。纪元1회는전체훈련데이터세트에대한하나의완전한훈련주기를의미합니다。미니배치크기와검데이터를지정합니다。Epoch당한번씩검정확도를계산합니다。

miniBatchSize = 10;valFrequency = floor(nummel (augimdsTrain.Files)/miniBatchSize);选项= trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...“MaxEpochs”6...“InitialLearnRate”3的军医,...“洗牌”“every-epoch”...“ValidationData”augimdsValidation,...“ValidationFrequency”valFrequency,...“详细”假的,...“阴谋”“训练进步”);

훈련데이터를사용하여신경망을훈련시킵니다。기본적으로trainNetwork는gpu를사용할수있으면gpu를사용합니다。GPU를사용하려면并行计算工具箱™와지원되는GPU장치가필요합니다。지원되는장치에대한자세한내용은릴리스별gpu지원(并行计算工具箱)항목을참조하십시오。Gpu를사용할수없으면trainNetwork는cpu를사용합니다。trainingOptions“ExecutionEnvironment”이름-값쌍通讯录수를사용하여실행환경을지정할수도있습니다。데이터세트의크기가매우작기때문에훈련이빠르게진행됩니다。

net = trainNetwork(augimdsTrain,lgraph,options);

검상분류하기

미세조정된신경망을사용하여검상을분류한다음분류정확도를계산합니다。

[YPred,probs] = category (net,augimdsValidation);accuracy = mean(YPred == imdsValidation.Labels)
准确度= 0.9000

4개의샘플검증영상을예측된레이블및이레이블을갖는영상의예측된확률과함께표시합니다。

idx = randperm(numel(imdsValidation.Files),4);数字i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(string(标签)+”、“+ num2str(100*max(probs(idx(i),:)),3) +“%”);结束

참고 문헌

[1]塞格迪,克里斯蒂安,刘伟,贾扬青,皮埃尔·塞尔曼内,斯科特·里德,德拉戈米尔·安格洛夫,杜米特鲁·埃尔汉,文森特·范豪克和安德鲁·拉宾诺维奇。“更深入地研究卷积。”在IEEE计算机视觉和模式识别会议论文集,第1-9页。2015.

참고 항목

|||||||||

관련 항목