사전훈련된신경망을사용한전이학습
이예제에서는사전훈련된GoogLeNet컨벌루션신경망이새로운영상모음에대해분류를수행하도록미세조정하는방법을보여줍니다。
1백만개가넘는영상에대해훈련된GoogLeNet은영상을키보드,커피머그잔,연필,각종동물등1000가지사물범주로분류할수있습니다。이신경망은다양한상을대하는다양한특징을학습했습니다。이신경망은영상을입력값으로받아서영상에있는사물에대한레이블과각사물범주의확률을출력합니다。
전이학습은딥러닝응용분야에서널리사용됩니다。사전훈련된신경망을새로운작업을학습하기위한출발점으로사용할수있습니다。전이학습으로신경망을미세조정하는것은무작위로초기화된가중치를사용하여신경망을처음부터훈련시키는것보다일반적으로훨씬더빠르고쉽습니다。학습된특징을보다적은개수의훈련영상을사용하여새로운작업으로빠르게전이할수있습니다。
데이터불러오기
새、상의압축을풀고、새、상데이터저장소로불러옵니다。imageDatastore
는폴더이름을기준으로상에자동으로레이블을지정하고데이터를ImageDatastore
객체로저장합니다。영상데이터저장소를사용하면메모리에담을수없는데이터를포함하여다량의영상데이터를저장할수있고컨벌루션신경망훈련중에영상배치를효율적으로읽어들일수있습니다。
解压缩(“MerchData.zip”);imds = imageDatastore(“MerchData”,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);
데이터를훈련데이터세트와검데이터세트로나눕니다。상의70%는훈련용으로사용하고30%는검용으로사용합니다。splitEachLabel
은은상데이터저장소를2개의새로운데이터저장소로분할합니다。
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,“随机”);
이매우작은데이터세트에는이제55개의훈련영상과20개의검증영상이포함됩니다。샘플상몇개를시합니다。
numTrainImages = numel(imdsTrain.Labels);idx = randperm(numTrainImages,16);数字为i = 1:16 subplot(4,4,i) i = readimage(imdsTrain,idx(i));imshow(我)结束
사전훈련된신경망불러오기
사전훈련된GoogLeNet신경망을불러옵니다。深度学习工具箱™模型为GoogLeNet网络가설치되어있지않으면이를다운로드할수있는링크가제공됩니다。
Net = googlenet;
deepNetworkDesigner
를사용하여신경망아키텍처에대한대화형방식시각화와신경망계층에대한상세한정보를표시합니다。
deepNetworkDesigner(净)
상입력계층첫번째계층은크기가224×224×3입력상이필합니다。여기서3은색채널의개수입니다。
inputSize = net.Layers(1).InputSize
inputSize =1×3224 224 3
마지막계층바꾸기
사전훈련된신경망网
의완전연결계층과분류계층은1000개의클래스에대해구성되어있습니다。GoogLeNet의두계층loss3-classifier
와输出
은신경망이추출하는특징을클래스확률,손실값및예측된레이블로조합하는방법에대한정보를포함합니다。사전훈련된신경망을새로운영상을분류하도록다시훈련시키려면이두계층을새데이터세트에맞게조정된새로운계층으로바꾸십시오。
훈련된신경망에서계층그래프를추출합니다。
lgraph = layerGraph(net);
이완전연결계층을출력값의개수가클래스개수와같은새로운완전연결계층으로교체합니다。전이된계층보다새로운계층에서학습이더빠르게이루어지도록하려면완전연결계층의WeightLearnRateFactor
값과BiasLearnRateFactor
값을높이십시오。
numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer(numClasses,...“名字”,“new_fc”,...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraph =替换层(lgraph,“loss3-classifier”, newLearnableLayer);
분류계층은신경망의출력클래스를지정합니다。분류계층을클래스레이블이없는새로운계층으로바꿉니다。trainNetwork
는훈련을진행할때계층의출력클래스를자동으로설정합니다。
newClassLayer = classificationLayer(“名字”,“new_classoutput”);lgraph =替换层(lgraph,“输出”, newClassLayer);
신경망훈련시키기
이신경망의입력영상은크기가224×224×3이어야하는데영상데이터저장소의영상은이와크기가다릅니다。대상데이터저장소를사용하여훈련상의크기를자동으로조정합니다。훈련상에대해추가로수행할대연산을지정합니다。즉,세로축을따라훈련영상을무작위로뒤집고,최대30개의픽셀을가로와세로방향으로무작위로평행이동합니다。데이터증대는신경망이과적합되는것을방지하고훈련영상의정확한세부정보가기억되지않도록하는데도움이됩니다。
pixelRange = [-30 30];imageAugmenter = imageDataAugmenter(...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augimdsTrain = augmentedimagedastore (inputSize(1:2)),imdsTrain,...“DataAugmentation”, imageAugmenter);
추가적인데이터증대를수행하지않고검증영상의크기를자동으로조정하려면증대영상데이터저장소를추가적인전처리연산지정없이사용하십시오。
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
훈련옵션을지정합니다。전이학습을위해,사전훈련된신경망의앞쪽계층의특징(전이된계층가중치)을유지합니다。전이된계층의학습을늦추려면초기학습률을작은값으로설정하십시오。이전단계에서는새로운마지막계층의학습속도를높이기위해완전연결계층의학습률인자를증가시켰습니다。이러한조합으로학습률을설정하면새로운계층에서는학습이빨라지고나머지계층에서는학습이느려집니다。전이학습을수행할때는많은횟수의纪元에대해훈련을진행하지않아도됩니다。纪元1회는전체훈련데이터세트에대한하나의완전한훈련주기를의미합니다。미니배치크기와검데이터를지정합니다。훈련 중에ValidationFrequency
번의반복마다신경망이검됩니다。
选项= trainingOptions(“个”,...“MiniBatchSize”10...“MaxEpochs”6...“InitialLearnRate”1的军医,...“洗牌”,“every-epoch”,...“ValidationData”augimdsValidation,...“ValidationFrequency”3,...“详细”假的,...“阴谋”,“训练进步”);
전이된계층과새로운계층으로구성된신경망을훈련시킵니다。기본적으로trainNetwork
는gpu를사용할수있으면gpu를사용합니다。GPU를사용하려면并行计算工具箱™와지원되는GPU장치가필요합니다。지원되는장치에대한자세한내용은릴리스별gpu지원(并行计算工具箱)항목을참조하십시오。Gpu를사용할수없으면cpu를사용합니다。trainingOptions
의“ExecutionEnvironment”
이름-값쌍通讯录수를사용하여실행환경을지정할수도있습니다。
netTransfer = trainNetwork(augimdsTrain,lgraph,options);
검상분류하기
미세조정한신경망을사용하여검상을분류합니다。
[YPred,scores] = category (netTransfer,augimdsValidation);
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));标题(字符串(标签));结束
검세트에대한분류정확도를계산합니다。정확도는신경망이올바르게예측하는레이블의비율입니다。
YValidation = imdsValidation.Labels;accuracy = mean(YPred == YValidation)
准确度= 1
분류정확도를높이기위한팁을보려면딥러닝팁과령항목을참조하십시오。
참고 문헌
[1] Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。深度卷积神经网络的ImageNet分类神经信息处理系统进展25(2012)。
[2]塞格迪,克里斯蒂安,刘伟,贾扬青,皮埃尔·塞尔曼内,斯科特·里德,德拉戈米尔·安格洛夫,杜米特鲁·埃尔汉,文森特·范豪克和安德鲁·拉宾诺维奇。“更深入地研究卷积。”IEEE计算机视觉和模式识别会议论文集(2015):1-9。
[3]“BVLC GoogLeNet模型。”https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet.
참고 항목
trainNetwork
|trainingOptions
|squeezenet
|googlenet
|analyzeNetwork
|심층신경망디자이너