1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
深度学习(DL,Deep Learning)是机器学习(ML,Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI,Artificial Intelligence)。 [1深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字、图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得 的效果,远远超过先前相关技术。
深度学习在搜索技术、数据挖掘、机器学习、机器翻译、自然语言处理、多媒体学习、语音、推荐和个性化技术,以及其他相关领域都取得了很多成果。深度学习使机器模仿视听和思考等人类的活动,解决了很多复杂的模式识别难题,使得人工智能相关技术取得了很大进步。
GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。inception的提出则从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。
inception模块的基本机构如图1,整个inception结构就是由多个这样的inception模块串联起来的。inception结构的主要贡献有两个:一是使用1x1的卷积来进行升降维;二是在多个尺寸上同时进行卷积再聚合。
作用1:在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。这个观点来自于Network in Network,图1里三个1x1卷积都起到了该作用。
图2左侧是是传统的卷积层结构(线性卷积),在一个尺度上只有一次卷积;图2右图是Network in Network结构(NIN结构),先进行一次普通的卷积(比如3x3),紧跟再进行一次1x1的卷积,对于某个像素点来说1x1卷积等效于该像素点在所有特征上进行一次全连接的计算,所以图2右侧图的1x1卷积画成了全连接层的形式,需要注意的是NIN结构中无论是第一个3x3卷积还是新增的1x1卷积,后面都紧跟着激活函数(比如relu)。将两个卷积串联,就能组合出更多的非线性特征。举个例子,假设第1个3x3卷积+激活函数近似于f1(x)=ax2+bx+c,第二个1x1卷积+激活函数近似于f2(x)=mx2+nx+q,那f1(x)和f2(f1(x))比哪个非线性更强,更能模拟非线性的特征?答案是显而易见的。NIN的结构和传统的神经网络中多层的结构有些类似,后者的多层是跨越了不同尺寸的感受野(通过层与层中间加pool层),从而在更高尺度上提取出特征;NIN结构是在同一个尺度上的多层(中间没有pool层),从而在相同的感受野范围能提取更强的非线性。
作用2:使用1x1卷积进行降维,降低了计算复杂度。图2中间3x3卷积和5x5卷积前的1x1卷积都起到了这个作用。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。图3是优化前后两种方案的乘法次数比较,同样是输入一组有192个特征、32x32大小,输出256组特征的数据,图3第一张图直接用3x3卷积实现,需要192x256x3x3x32x32=452984832次乘法;图3第二张图先用1x1的卷积降到96个特征,再用3x3卷积恢复出256组特征,需要192x96x1x1x32x32+96x256x3x3x32x32=245366784次乘法,使用1x1卷积降维的方法节省了一半的计算量。
3.MATLAB核心程序
```Validation_Frequency = floor(numel(Augmented_Training_Image.Files)/5);
Training_Options = trainingOptions('sgdm',...
'MiniBatchSize', 5, ...
'MaxEpochs', 12,...
'InitialLearnRate', 5e-4,...
'Shuffle', 'every-epoch', ...
'ValidationData', Augmented_Validation_Image, ...
'ValidationFrequency', Validation_Frequency, ...
'Verbose', false, ...
'Plots', 'training-progress');
net = trainNetwork(Augmented_Training_Image, Layer_Graph, Training_Options);
.................................................................
figure;
Img = imread('test\Bill_Gates.jpg');
Resize = imresize(Img, [224, 224]);
[Label, Prob] = classify(net,Resize);
subplot(231);
imshow(Resize);
title({char(Label), num2str(max(Prob),2)});
Img = imread('test\Einstein.jpg');
Resize = imresize(Img, [224, 224]);
[Label, Prob] = classify(net,Resize);
subplot(232);
imshow(Resize);
title({char(Label), num2str(max(Prob),2)});
Img = imread('test\Elon.jpg');
Resize = imresize(Img, [224, 224]);
[Label, Prob] = classify(net,Resize);
subplot(233);
imshow(Resize);
title({char(Label), num2str(max(Prob),2)});
Img = imread('test\Jackie.jpg');
Resize = imresize(Img, [224, 224]);
[Label, Prob] = classify(net,Resize);
subplot(234);
imshow(Resize);
title({char(Label), num2str(max(Prob),2)});
Img = imread('test\Stephen.jpg');
Resize = imresize(Img, [224, 224]);
[Label, Prob] = classify(net,Resize);
subplot(235);
imshow(Resize);
title({char(Label), num2str(max(Prob),2)});
Img = imread('test\tom.jpg');
Resize = imresize(Img, [224, 224]);
[Label, Prob] = classify(net,Resize);
subplot(236);
imshow(Resize);
title({char(Label), num2str(max(Prob),2)});
```