Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
»úÆ÷ѧϰ----matlabÖеÄCNN
 
  5639  次浏览      31
 2018-9-28 
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚCSDN£¬½éÉÜÁËCNN·ÖÀàÎÊÌâÒÔ¼°ÈçºÎÓÃmatlab×Ô´øÊý¾Ý¼¯×ö³µÁ¾¼ì²âµÈÏà¹ØÖªÊ¶¡£

1.ǰÑÔ

×î½üÐèÒªÓõ½¾í»ýÉñ¾­ÍøÂç(CNN)£¬ÔÚ»¹Ã»ÍêÈ«ÕÆÎÕcuda+caffe+TensorFlow+pythonÕâÒ»Ì×´«Í³µÄÉî¶ÈѧϰµÄÁ÷³ÌµÄʱºò£¬Ïëµ½ÁËmatlab£¬×Ô¼º²éÁËÒ»ÏÂdocumentation,»¹ÕæµÄÓÐÉî¶ÈѧϰµÄÏà¹Øº¯Êý¡£ËùÒÔ¸ø×Ô¼ºÌá¸öÐÑ£¬ÔÚÐèÒªÓõ½Ä³¸ö³ÉÊìµÄ¼¼ÊõʱÏȲéÒ»ÏÂmatlabµÄ°ïÖúÎĵµ£¬ÕâÑù»á¼õÉٺܶàʱ¼ä³É±¾¡£¼ÇµÃ»úÆ÷ѧϰµÄ´óÅ£Andrew NG.˵¹ýÔÚ¹è¹ÈºÃ¶àÈ˶¼ÊÇÏÈÓÃmatlab/octavaÏÈʵÏÖ×Ô¼ºµÄÏë·¨£¬ÔÙת»¯³ÉÆäËûÓïÑÔ¡£

2.ÅäÖÃÐèÇó

ÒªÏñÓÃmatlabʵÏÖdeep learning£¬ÐèÒª¸üе½2017a°æ±¾¡£GPU¼ÓËٵϰ£¬ÐèÒª°²×°cuda8.0, ×Ô¼ºGPU µÄcompute capacity Òª3.0 ÒÔÉÏ¡£

3. ¿ÉÒÔÍê³ÉµÄÈÎÎñ

ÎÒÃÇ¿´Ò»ÏÂmatlabµÄмӵÄÉî¶Èѧϰ¹¦ÄÜ¿ÉÒÔÍê³ÉÄÄЩÈÎÎñ

1. »ñÈ¡±ðÈËѵÁ·ºÃµÄCNNÍøÂç

2. Ç¨ÒÆÑ§Ï°(transfer learning and fine-tune)

3. ½â¾ö·ÖÀàÎÊÌâ(classifiy problem)

4. ½â¾ö»Ø¹éÎÊÌâ(regression problem)

5. ÎïÌå¼ì²â(object detection)

6. Ìáȡѧϰµ½µÄÌØÕ÷

3.1 »ñÈ¡±ðÈËѵÁ·ºÃµÄÍøÂç

matlab2017ÖУ¬¿ÉÒÔÓñðÈËѵÁ·ºÃµÄÏֳɵÄÍøÂ磬Ҳ¿ÉÒÔÊäÈëcaffeÖеÄÍøÂ硣ĿǰÒÑÖªµÄ¿ÉÒÔÓõÄÍøÂç°üÀ¨ÓÃÓÚ·ÖÀàµÄ£ºAlexnet, vgg16, vgg19¡£ÒѾ­ÓÃÓÚÎïÌå¼ì²âµÄ£¬RCNN, FastRCNN, Faster RCNN¡£ÓÉÓÚ×î½üÒ»Ö±Ñо¿µÄÊÇ·ÖÀàºÍ»Ø¹éÎÊÌ⣬ÎïÌå¼ì²âµÄCNNÔÚ¹ýºó²¹È«¡£ÕâÀïÖ»¾ÙÒ»¸ö·ÖÀàµÄÀý×Ó¡£

Alexnet×÷Ϊ2012ÄêImageNetµÄ¹Ú¾ü£¬ËüµÄÌá³öȷʵӰÏìµ½ÁËCVµÄÑо¿Èȵ㣬ÈËÃǾªÆæµÄ·¢ÏÖÉî¶ÈÍøÂçµÄÃèÊöÄÜÁ¦¾ÓÈ»Õâôǿ£¬ËäÈ»±³ºóµÄÊýѧԭÀíһֱûÄܵõ½ÍêÃÀµÄ½â¾ö£¬µ«²»·Á°­ËüÇ¿´óµÄÄÜÁ¦£¬ÎÒÃÇ¿´¿´ËýÔÚmatlabÖÐÊÇÈçºÎ×ö·ÖÀàµÄ¡£Ê×ÏÈÌù³ö´úÂ룺

clear;clc;close all;
%»ñÈ¡alexnet
net = alexnet;
%¶ÁÕÕÆ¬Ñ¡ÎïÌå
I= imread('peppers.png');
[cropedim, rect2]=imcrop(I);
cropedim=imresize(cropedim,[227 227]);
figure,imshow(cropedim);
% ÓÃAlexNet·ÖÀà
label = classify(net, cropedim);
% ÏÔʾ½á¹û
figure;
imshow(I);
rectangle('position',rect2,'EdgeColor','r'
,'LineWidth',2);
text(10,20,char(label),'Color','white','FontSize',20);

ÓÃmatlab×Ô´øµÄÕÕÆ¬²âÊÔһϷÖÀàµÄ׼ȷÂÊ£¬µÃµ½µÄ½á¹ûÈçÏÂ

bell pepperÊÇÌð½·µÄÒâ˼£¬ÎÒÃÇ·¢ÏÖЧ¹û»¹ÊDz»´íµÄ£¬¸ÐÐËȤµÄͬѧ¿ÉÒÔ¶àÕÒ¼¸ÕŲâÊÔͼƬÊÔһϡ£ÓÃ

net.Layers

ÃüÁî¿ÉÒÔ¿´AlnexnetµÄÍøÂç½á¹¹£¬µÃµ½ÒÔÏÂ

ÕâÊÇÒ»¸ö25²ãµÄÍøÂ磬ÿһ²ã¶¼¶ÔÓ¦×ÅÏêϸµÄ˵Ã÷¡£ÖµµÃ¹Ø×¢µÄÊÇÓÐ5¸ö¾í»ý²ã(convolution layer)ºÍÈý¸öÈ«Á¬½Ó²ã(full connection layer)¡£ÆäËûµÄvgg16ºÍvgg19ÊÇÏàͬµÄµÀÀí£¬²»¹ýÒª¿´Çå³þÍøÂçµÄÊäÈ룬ʹÓÃvgg19ʱ£¬ÐèÒª¸Ä±äÉϱߴúÂëÖеÄÁ½ÐÐ

net = vgg19;
cropedim=imresize(cropedim,[224 224]);

ʣϵIJ¿·ÖÊÇÒ»ÑùµÄ¡£µ±È»Ò²¿ÉÒÔ´ÓcaffeÖе¼Èë×Ô¼ºÑµÁ·ºÃµÄÍøÂ磬×Ô¼º»¹Ã»ÓÐÍêÈ«ÕÆÎÕcaffe,ÊìϤÕⲿ·ÖµÄͬѧ¿ÉÒÔ×Ô¼ºÊµÏÖһϡ£

3.2 Ç¨ÒÆÑ§Ï°(transfer learning and fine-tune)

ËùÎ½Ç¨ÒÆÑ§Ï°(transfer learning)¾ÍÊÇ΢µ÷(fine-tune)±ðÈËѵÁ·ºÃµÄÍøÂçÖеÄijЩ²ÎÊý£¬Ê¹µÃËü¸üÊʺÏ×Ô¼ºµÄÊý¾Ý¼¯¡£Ç¨ÒÆÑ§Ï°Ê¹ÓõÄÇé¿öÊÇ:¼¸°Ùµ½¼¸Ç§¸öѵÁ·Ñù±¾£¬Ïë¿ìËÙѵÁ·ÍøÂç¡£ÍøÂçµÄѵÁ·¹ý³Ì¾ÍÊǸտªÊ¼Îª¸÷¸ö²ÎÊý¸³ÓèËæ»úµÄÖµ£¬²ÉÓÃÊýÖµµÄ·½·¨(Ò»°ãÊÇÌݶÈϽµ·¨)ÇóÈÃcost function ´ïµ½×îСֵµÄ¸÷¸ö²ÎÊýµÄȡֵ£¬ÕâЩ²ÎÊýÖ÷Òª²úÉúÓÚ¸÷¸ö²ãÖ®¼äÁ¬½ÓʱºòµÄȨֵ¡£Cost functionÊDZ궨ºÃµÄÊý¾ÝÓëͨ¹ýÍøÂç¼ÆËã³öµÄÊý¾ÝµÄ²îµÄÀÛ¼Ó¡£Cost functionԽС˵Ã÷ÍøÂçµÄÐÔÄÜÔ½ºÃ¡£ÎÒÃÇ¿´¿´matlabÖÐÊÇÈçºÎÓÃÏÖÓеÄÍøÂç×öÇ¨ÒÆÑ§Ï°µÄ£¬ÎÒÃǾÙÒ»¸öÊÖдÌåʶ±ðµÄÀý×Ó£¬ÆäÖÐmatlab×Ô¼ºÌṩÁËѵÁ·¼¯ºÍ²âÊÔ¼¯¡£ÏÈÌù³ö´úÂ룺

%% transfer learning
%¶ÁȡѵÁ·¼¯ºÍ²âÊÔ¼¯
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
'nndatasets','DigitDataset');
digitData = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
[trainDigitData,testDigitData] = splitEachLabel
(digitData,0.5,'randomize');
%ÏÔʾǰ20¸öѵÁ·ÕÕÆ¬
numImages = numel(trainDigitData.Files);
idx = randperm(numImages,20);
for i = 1:20
subplot(4,5,i)
I = readimage(trainDigitData, idx(i));
imshow(I)
end
% »ñÈ¡matlab×Ô¼ºÑµÁ·ºÃµÄÍøÂç
load(fullfile(matlabroot,'examples',
'nnet','LettersClassificationNet.mat'))
% ¸Ä±äÊä³ö²ãµÄÀà±ð¸öÊý
layersTransfer = net.Layers(1:end-3);
% ÏÔʾеÄÀà±ð¸öÊý
numClasses = numel(categories(trainDigitData.Labels));
% °Ñ×îºóÈý²ãÌæ»»³ÉеÄÀà±ð
layers = [...
layersTransfer
fullyConnectedLayer(numClasses,
'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
softmaxLayer
classificationLayer];
optionsTransfer = trainingOptions('sgdm',...
'MaxEpochs',5,...
'InitialLearnRate',0.0001,...
'ExecutionEnvironment','cpu');
% ѵÁ·ÍøÂç
netTransfer = trainNetwork(trainDigitData,layers,optionsTransfer);
% ÏÔʾ²âÊÔ׼ȷÂÊ
YPred = classify(netTransfer,testDigitData);
YTest = testDigitData.Labels;
accuracy = sum(YPred==YTest)/numel(YTest);
% ÏÔʾ²âÊÔ½á¹û
idx = 501:500:5000;
figure
for i = 1:numel(idx)
subplot(3,3,i)
I = readimage(testDigitData, idx(i));
label = char(YTest(idx(i)));
imshow(I)
title(label)
end

´úÂëµÄǰ±ßµÄ²¿·ÖÊǶÁÈ¡matlabÖÐ×Ô´øµÄÊý¾Ý¼¯ºÍ²âÊÔ¼¯£¬°ÑËü±£´æ³ÉimageDatastore¸ñʽ£¬ÕâÖÖ¸ñʽֻÐèÒªÌṩͼƬµÄ·¾¶ÐÅÏ¢¶ø²»ÓðÑͼƬȫ²¿¶ÁÈëÄÚ´æÖУ¬Òò´Ë·Ç³£Êʺϴó¹æÄ£µÄÊý¾Ý¼¯¡£Öм䲿·ÖÊÇÐÞ¸ÄѵÁ·ºÃµÄÍøÂçÖеÄ×îºóÈý²ã£¬Ô­ÍøÂçÓÃÀ´Ê¶±ðÊÖдµÄ×ÖĸºÍÊý×ÖÓÐ36À࣬¶øÏÖÔÚµÄÈÎÎñÖ»ÐèҪʶ±ðÊÖдÌåÊý×Ö£¬ËùÒÔ°ÑËüÃǸijÉ10À࣬ÔÚѵÁ·Ê±Ê¹ÓÃ0.0001µÄѧϰÂÊ£¬¹²¼ÆËã5ÂÖ£¬ÓÃcpu×öѵÁ·¡£´úÂëµÄ×îºó²¿·ÖÊDzâÊÔÐÂѵÁ·ºÃµÄÍøÂ磬ÒòΪtransfer learnÊÇÔÚÏÖÓеÄÍøÂç»ù´¡ÉÏ×ö²ÎÊýµÄ΢µ÷£¬ËùÒÔѵÁ·ËٶȺܿ죬ÎÒÃÇ¿´Ò»ÏÂѵÁ·Ð§¹û¡£

ÓÉÓÚÊÇÔÚcpuÉÏ×öµÄѵÁ·£¬¶øÇÒÊÇtransfer learning ËùÒÔѵÁ·µÄ¹ý³ÌºÜ¿ì£¬ÎÒÃÇ·¢ÏÖÖØÐÂѵÁ·ºÃµÄÍøÂçÄÜ´ïµ½ºÜ¸ßµÄ׼ȷÂÊ¡£ÎÒÃÇÔÙ¿´gpuÉϵÄѵÁ·

ÓÉÓÚ²ÎÊýµÄ³õʼ»¯ÊÇËæ»úµÄ£¬Òò´ËµÃµ½µÄ½á¹ûÒ²ÊÇËæ»úµÄ£¬²»¹ý¿ÉÒÔ¿´³ögpuÉÏ×öѵÁ·Ã÷ÏÔÒª¿ìºÜ¶à£¡GPUµÄµÚÒ»ÂÖ¼ÆËãÂýÊÇÒòΪÊý¾ÝÒªÖØÐ³õʼ»¯Îªgpu¾ØÕó¡£×îºó·ÅÒ»ÕÅЧ¹ûͼ£º

ÎÒÃÇ·¢ÏÖʶ±ðµÄЧ¹û»¹ÊDz»´íµÄ¡£

3.3 ·ÖÀàÎÊÌâ(classification problem)

CNNÖ®ËùÒÔÄÜÒýÆð¹ã·º¹Ø×¢£¬¾ÍÊÇÔÚÓÚËü×î³õÔÚͼÏñ·ÖÀà·½ÃæÈ¡µÃºÜ´óµÄ³É¹¦£¬ºóÀ´ÈËÃÇ·¢ÏÖ¶ÔÓÚÆäËûµÄ·ÖÀàÎÊÌ⣬CNNÒ²ÓкܺõÄÐÔÄÜ¡£Éϱ߽²µÄÇ¨ÒÆÑ§Ï°½â¾öµÄÒ²ÊÇÒ»ÖÖ·ÖÀàÎÊÌ⣬½ÓÏÂÀ´µÄÐðÊöÒ²¾Í½¨Á¢ÔÚÉÏÎĵĻù´¡ÉÏ¡£

ÎÒÃÇÕâÀïÒª½â¾öµÄ·ÖÀàÎÊÌ⣬¾ÍÊÇѵÁ·×Ô¼ºµÄ·ÖÀàÍøÂ硣֮ǰµÄÇ¨ÒÆÑ§Ï°ÒѾ­ËµÃ÷£¬ËùνѵÁ·¾ÍÊÇΪÿ²ãÍøÂçÖ®¼äѰÕÒʹµÃcost function×îСµÄȨֵ£¬ÕâЩȨֵ¸Õ¿ªÊ¼Êǰ´ÕÕijÖÖ·Ö²¼Ëæ»ú³õʼ»¯µÄ£¬ÎÒÃÇÓÃÊýÖµµÄ·½·¨Çócost functionµÄ×îСֵ¡£Ò»°ãÀ´Ëµ£¬ÎÒÃÇÓÃÉñ¾­ÍøÂ罨Á¢µÄÊÇÒ»¸ö·Ç³£¸´ÔÓµÄÄ£ÐÍ£¬ÎÒÃÇÍùÍùÄÜÄÑÕÒµ½Õâ¸öÄ£Ð͵Ä×îСֵ£¬µ«¿ÉÒÔÕÒµ½ËüµÄ¼«Ð¡Öµ(¾Ö²¿×îСֵ)£¬ÕâЩ¼«Ð¡ÖµÒѾ­ºÜ½Ó½üÎÒÃÇÒªÕÒµ½×îСֵ¡£

ҪѵÁ·×Ô¼ºµÄÍøÂ磬ÎÒÃÇÒªÏȽ¨Á¢×Ô¼ºµÄÍøÂ磬²¢ÉèÖÃÒ»¶¨µÄѵÁ·²ÎÊý¡£ÎÒÃÇ¿´Ò»ÏÂmatlabsÊÇÈçºÎÍê³ÉµÄ¡£

ÔÚmatlabÖÐÓÃÀ´½¨Á¢ÍøÂçµÄÓï¾äÈçÏ£º

layers = [ ...
imageInputLayer([imsize imsize 1])
convolution2dLayer(5,150)
reluLayer
crossChannelNormalizationLayer(5,'Alpha',0.00005,
'Beta',0.75,'K',1) %Norm layer1
convolution2dLayer(3,300,'Stride',1,
'BiasLearnRateFactor',2) %Cov2 layer
reluLayer
fullyConnectedLayer(1)
softmaxLayer
classificationLayer];

Ö±½ÓÓÃÊý×齨Á¢ÍøÂ磬Õâ¸öÀý×ÓÊǽ¨Á¢Ò»¸ö9²ãµÄ·ÖÀàÍøÂ磬°üÀ¨ÊäÈë²ã£¬¾í»ý²ã1£¬¼¤»îº¯Êý²ã1£¬±ê×¼»¯²ã£¬¾í»ý²ã2£¬¼¤»îº¯Êý²ã2£¬È«Á¬½Ó²ã£¬È¥×î´óÖµ²ã£¬·ÖÀà²ã¡£ÖÁÓÚÈçºÎÑ¡ÔñÊʺÏ×Ô¼ºµÄÍøÂç½á¹¹£¬ÎÒĿǰ»¹Ã»ÓиãÌ«Çå³þ£¬²»¹ý£¬¿ÉÒÔÏÖÔÚ±ðÈ˵ÄÍøÂç»ù´¡ÉÏ×öÐ޸ġ£

ÓÃÀ´É趨Ð޸IJÎÊýµÄÓï¾äÈçÏ£º

options = trainingOptions('sgdm', ...
'MaxEpochs',15, ...
'InitialLearnRate',1e-4, ...
'MiniBatchSize',256,...
'ExecutionEnvironment','gpu');
'OutputFcn',functions);

ÕâЩ²ÎÊýÊÇCNNÍøÂçµÄ»ù±¾²ÎÊý£¬MaxEpochÊǼÆËãµÄÂÖÊý£¬ËüµÄÖµÔ½´óÔ½ÈÝÒ×ÊÕÁ²£¬InitialLearRateÊÇѧϰÂÊ£¬Ì«´óÄ£ÐÍ¿ÉÄܲ»»áÊÕÁ²£¬Ì«Ð¡ÔòÊÕÁ²µÄÌ«Âý¡£MiniBatchSizeÊÇÿ´Î´¦ÀíµÄÊý¾ÝµÄ¸öÊý£¬ExcutionEnviromentÊÇѵÁ·ÍøÂçµÄ»·¾³£¬¿ÉÒÔÔÚCPU(¡®cpu¡¯)ÉÏ×ö£¬Ò²¿ÉÔÚGPU(¡®gpu¡¯)ÉÏ×ö£¬¿ÉÒÔ²¢ÐÐ(¡®paralle¡¯)£¬Ä¬ÈϵÄÇé¿öÊÇÏȲâÊÔgpu£¬Èç¹û²»¿ÉÓÃÔÚ²âÊÔgpu¡£ÔÚmatlabÉÏÓÃgpuѵÁ·ÍøÂçʱÐèÒªcuda8.0, ÏÔ¿¨¼ÆËãÄÜÁ¦Îª3.0¡£ÕâЩ²ÎÊý¿ÉÒÔÓÃÖ¸ÁîgpuDeviceÀ´²é¿´¡£OutputFcnÊÇ¿ÉÒÔÔÚѵÁ·¹ý³ÌÖе÷ÓõÄijЩº¯Êý¡£±ÈÈ磺Ëü¿ÉÒÔÓÃÀ´»­cost functionÖµµÄ±ä»¯¡£ÈçºÎÏñ¿ÉÊÓ»¯ÑµÁ·±í¸ñ£¨ÉÏÎÄÊä³öµÄÄÇЩ£©Ä³Ð©Êý¾Ý¿ÉÒÔµ÷ÓÃÏàÓ¦µÄº¯Êý£¬ÎÒÔڻعéÎÊÌâʱ»áÔÙ˵Ã÷¡£

É趨ºÃÍøÂç½á¹¹ºÍѵÁ·²ÎÊýºó£¬¿ÉÒÔÓÃ

net = trainNetwork(trainData,layers,options);

À´ÑµÁ·×Ô¼ºµÄÍøÂ磬ѵÁ·Êý¾Ý¿ÉÒÔÊÇImageDatastoreÀàÐÍ£¬¿ÉÒÔÊÇ4-DÊý×飬Ëĸöά¶È·Ö±ðÊdz¤¶È£¬¿í¶È£¬Í¨µÀÊý£¬µÚ¼¸¸öͼƬ¡£ÒòΪ4-DÊý×éÊÇÒ»´ÎÐÔ×°Èëµ½ÄÚ´æÖеģ¬Èç¹ûÊý¾ÝÁ¿Ì«´óʱÉ÷Óã¬Ð¡ÐÄÄÚ´æ²»×㡣ͬÑù£¬ÎÒÃǾÙÒ»¸öÍêÕûµÄÀý×Ó£¬Ò²ÊÇÀûÓÃmatlab×Ô´øµÄÊý¾Ý¼¯È¥·ÖÀàÊÖдÌå¡£´úÂëÈçÏ£º

%¶ÁÈ¡Êý¾Ý¼¯²¢±£´æ³ÉimageDatastoreÐÎʽ
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos',...
'nndatasets','DigitDataset');
digitData = imageDatastore(digitDatasetPath,...
'IncludeSubfolders',true,'LabelSource','foldernames');
%Ëæ»úÏÔʾ¶þÊ®¸öѵÁ·¼¯ÖеÄͼƬ
figure;
perm = randperm(10000,20);
for i = 1:20
subplot(4,5,i);
imshow(digitData.Files{perm(i)});
end
%°ÑÊý¾Ý¼¯»®·Ö³ÉѵÁ·¼¯ºÍ²âÊÔ¼¯
trainingNumFiles = 750;
rng(1) % For reproducibility
[trainDigitData,testDigitData] = splitEachLabel(digitData,...
trainingNumFiles,'randomize');
%½¨Á¢×Ô¼ºµÄÍøÂç
layers = [imageInputLayer([28 28 1]);
convolution2dLayer(5,20);
reluLayer();
maxPooling2dLayer(2,'Stride',2);
fullyConnectedLayer(10);
softmaxLayer();
classificationLayer()];
%É趨ѵÁ·²ÎÊý
options = trainingOptions('sgdm','MaxEpochs',20,...
'InitialLearnRate',0.0001);
%ѵÁ·ÍøÂç
convnet = trainNetwork(trainDigitData,layers,options);
%²âÊÔÍøÂç
YTest = classify(convnet,testDigitData);
TTest = testDigitData.Labels;
accuracy = sum(YTest == TTest)/numel(TTest);
disp(accuracy);

ÎÒ×Ô¼ºµÄѵÁ·½á¹ûÈçÏ£º

×Ô¼ºÊÇÔÚgpuÉÏ×öµÄ£¬ËùÒÔʱ¼ä½Ï¶Ì£¬×îºóµÃµ½·ÖÀà׼ȷÂÊ·¢ÏÖ»¹²»´í¡£

3.4 »Ø¹éÎÊÌâ(regression problem)

»Ø¹éÎÊÌâÓë·ÖÀàÎÊÌâµÄ´¦Àí·½Ê½Ïàͬ£¬ÎÒÃÇÈÔÈ»ÐèҪѵÁ·¼¯ºÍ²âÊÔ¼¯¡£ÔÚÍøÂ·½á¹¹ÉÏÓÐЩ²»Í¬£¬×îºóÒ»´Î±ØÐëÊÇRegression layer, ¶øµ¹ÊýµÚ¶þ´Î±ØÐëÊǾí»ý²ã¡£»Ø¹éÎÊÌâµÄÍøÂçÖеIJÎÊýÓë·ÖÀàÎÊÌâÊÇÒ»ÑùµÄ£¬ÕâÀï²»ÔÙÏêϸ˵Ã÷£¬ÎÒÃÇÖ±½Ó·ÖÎöÒ»¸öÀý×Ó£¬¿´Ò»ÏÂmatlabÊÇÈçºÎ×ö·ÖÀàµÄ¡£Õâ¸öÎÊÌâͬʱ¿´Ò»ÏÂfunction²ÎÊýµÄ×÷Óá£Õâ´ÎÒª½â¾öµÄÎÊÌâÊÇ£¬Í¼Æ¬ÖеÄ×Öĸµ½µ×ÐýתÁ˶àÉÙ¶È¡£Êý¾Ý¼¯Í¬ÑùÀ´×Ômatlab´úÂëÈçÏ£º

%¶ÁÈ¡Êý¾Ý¼¯
[trainImages,~,trainAngles] = digitTrain4DArrayData;
%ÏÔʾÈÎÒâ¶þÊ®¸ö½á¹û
numTrainImages = size(trainImages,4);
figure
idx = randperm(numTrainImages,20);
for i = 1:numel(idx)
subplot(4,5,i)
imshow(trainImages(:,:,:,idx(i)))
drawnow
end
%½¨Á¢»Ø¹éÍøÂç
layers = [ ...
imageInputLayer([28 28 1])
convolution2dLayer(12,25)
reluLayer
fullyConnectedLayer(1)
regressionLayer];
%ÉèÖÃѵÁ·²ÎÊý
functions={...
@plotTrainingRMSE,...
@(info)stopTrainingAtThreshold(info,0)};
options = trainingOptions('sgdm', ...
'MaxEpochs',20, ...
'InitialLearnRate',1e-3, ...
'MiniBatchSize',128,...
'ExecutionEnvironment','gpu',...
'OutputFcn',functions);
%ѵÁ·ÍøÂç
net = trainNetwork(trainImages,trainAngles,
layers,options);
%²âÊÔÍøÂç
[testImages,~,testAngles] = digitTest4DArrayData;
predictedTestAngles = predict(net,testImages);
%²é¿´ÄâºÏÎó²î
predictionError = testAngles - predictedTestAngles;
thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numTestImages = size(testImages,4);
accuracy = numCorrect/numTestImages;
disp('accuracy');
disp(accuracy);
squares = predictionError.^2;
rmse = sqrt(mean(squares));
disp('the rmse');
disp(rmse);
%train function
function plotTrainingRMSE(info)
persistent plotObj
if info.State == "start"
figure;
plotObj = animatedline;
xlabel("Iteration")
ylabel("Training RMSE")
elseif info.State == "iteration"
addpoints(plotObj,info.Iteration,double
(info.TrainingRMSE))
drawnow limitrate nocallbacks
end
end
function stop = stopTrainingAtThreshold(info,thr)
stop = false;
if info.State ~= "iteration"
return
end
persistent TrainingRMSE
% Append accuracy for this iteration
T= info.TrainingRMSE;
% Evaluate mean of iteration accuracy and remove oldest entry
stop = T <thr;
end

µÃµ½µÄ»Ø¹é½á¹ûÈçÏ£º

ÎÒÃÇÔÚѵÁ·¹ý³ÌÖе÷ÓÃÁ½¸öº¯Êý£¬plotTrainingRMSEÊÇÓÃÀ´»­cost functionÊÇÈçºÎ±ä»¯µÄ£¬(info)stopTrainingAtThreshold(info,0)ÊÇÉèÖÃѵÁ·Ìáǰ½áÊøµÄÌõ¼þµÄ£¬¿ÉÒÔ¸ù¾Ý±íÖеÄijЩ²ÎÊýÈÃѵÁ·ÔÚÒ»¶¨Ìõ¼þÏÂÍ£ÏÂÀ´¡£×îºó£¬ÎÒÃÇ¿´Ò»ÏÂcost function µÄ±ä»»¹æÂÉ£¬ÈçÏ£º

ĿǰΪֹ£¬ÎÒÃÇÓÃcnn½â¾öÁË×î»ù±¾µÄ·ÖÀàÎÊÌâºÍ»Ø¹éÎÊÌ⣬´ËÍ⣬»¹½éÉÜÁËÈçºÎ½¨Á¢ÍøÂçºÍÉ趨²ÎÊý£¬ºó±ß½«²¹³ä¼ì²â²¿·Ö¡£

3.3 ¼ì²âÎÊÌâ(Detection problem)

ͬÑùÓÃmatlab×Ô´øÊý¾Ý¼¯×ö³µÁ¾¼ì²â£¬¹ØÓÚ¼ì²âµÄÍøÂçÓÐRCNN, Fast RCNN, Faster RCNN, ËûÃÇ´óͬСÒ죬²î¾àÔÚÓÚËٶȵĿìÂý£¬ÎÒÃÇÖ»²âÊÔFaster RCNN

1) ¶ÁÈ¡Êý¾Ý

data = load('fasterRCNNVehicleTrainingData.mat');

dataÊǸö½á¹¹ÌåÀàÐ͵ÄÊý¾Ý£¬Ö÷ÒªÊÇÓÃÀ´ËĸöÊôÐÔ·Ö±ðÊÇdetector, layers, result, vehicleTraining.

ÆäÖУ¬detector, layers, reaultÊÇÌáǰѵÁ·ºÃµÄ¼ì²â×Ó£¬ÍøÂçºÍ²âÊÔ½á¹û£¬ÎÒÃÇÓÃvehicleTrainingÖØÐÂѵÁ·CNNÍøÂ磬ÓÃlayersÀ´Éè¼ÆÍøÂç½á¹¹

2) ³éÈ¡ÓÃÓÚѵÁ·µÄͼÏñ

trainingData = data.vehicleTrainingData;
trainingData.imageFilename=fullfile(toolboxdir
('vision'),'visiondata',...
trainingData.imageFilename);

³éÈ¡³öµÄtrainingDataÊÇtable¸ñʽµÄ£¬matlabѵÁ·ÍøÂçRCNNÍøÂçÖ»ÄÜÓÃtable¸ñʽ¡£

3) ¶ÁÈ¡ÍøÂç½á¹¹

layers=data.layers;

¸ÃÍøÂçÊǸö11²ãµÄÍøÂ磬ѵÁ·Ê±ÎÒÃÇ¿ÉÒÔÉè¼Æ×Ô¼ºµÄÍøÂç½á¹¹£¬Ò²¿ÉÒÔÔÚÕâ¸öÍøÂçµÄ»ù´¡ÉÏ×öѵÁ·¡£

4) ÉèÖÃѵÁ·Ñ¡Ïî

options = trainingOptions('sgdm', ...
'InitialLearnRate',1e-6,...
'MaxEpochs',1,...
'ExecutionEnvironment','gpu',...
'CheckpointPath',tempdir);

ÕâÀïÉèÖõÄÊdzõʼѧϰÂÊΪ 1e-6, µü´ú1ÂÖ£¬ÓÃGPU×öѵÁ·£¬ÔÚѵÁ·Ê±»á°ÑcheckpointµÄ½á¹û´æÏÂÀ´¡£

5) ѵÁ·ÍøÂç

detector = trainFasterRCNNObjectDetector(trainingData,
layers,options);

ÓÃtrainingData×öѵÁ·Êý¾Ý£¬ÑµÁ·layersÍøÂ磬ÔÚѵÁ·¹ý³ÌÖÐÑ¡ÔñoptionÖеÄѵÁ·²ÎÊý£¬Í¬ÑùÓÃÁËGPU×öѵÁ·£¬ÆäÖеÄÒ»²½ÈçÏ£º

6) ½á¹û¼ì²â

img=imread('highway.png');
[bbox,score,label]=detect(detector,img);
detectedImg=insertShape(img,'Rectangle',bbox);
figure,imshow(detectedImg);

´ÓMatlab×ÔÉíͼ¿âÖÐÑ¡ÔñhightwayÕâÕÅÕÕÆ¬£¬ÓøղÅѵÁ·³öµÄÍøÂç¼à²âÀï±ßµÄ³µÁ¾£¬ÆäÖÐbboxÊǼà²â³öµÄ°üΧºÐµÄ×ø±ê£¬Õâ¸ö¿ÉÒÔÓÃÀ´·µ»Ø¡£

Õâ½á¹ûÏÔʾÈçÏ£º

   
5639 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

»ùÓÚͼ¾í»ýÍøÂçµÄͼÉî¶Èѧϰ
×Ô¶¯¼ÝÊ»ÖеÄ3DÄ¿±ê¼ì²â
¹¤Òµ»úÆ÷ÈË¿ØÖÆÏµÍ³¼Ü¹¹½éÉÜ
ÏîĿʵս£ºÈçºÎ¹¹½¨ÖªÊ¶Í¼Æ×
 
Ïà¹ØÎĵµ

5GÈ˹¤ÖÇÄÜÎïÁªÍøµÄµäÐÍÓ¦ÓÃ
Éî¶ÈѧϰÔÚ×Ô¶¯¼ÝÊ»ÖеÄÓ¦ÓÃ
ͼÉñ¾­ÍøÂçÔÚ½»²æÑ§¿ÆÁìÓòµÄÓ¦ÓÃÑо¿
ÎÞÈË»úϵͳԭÀí
Ïà¹Ø¿Î³Ì

È˹¤ÖÇÄÜ¡¢»úÆ÷ѧϰ&TensorFlow
»úÆ÷ÈËÈí¼þ¿ª·¢¼¼Êõ
È˹¤ÖÇÄÜ£¬»úÆ÷ѧϰºÍÉî¶Èѧϰ
ͼÏñ´¦ÀíËã·¨·½·¨Óëʵ¼ù