提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、LeNet-5简要原理
- 二、LeNet-5详细原理与MATLAB编程过程(完整程序于本节末)
-
- 1.导入minist数据集
- 2.设计改进版LeNet-5结构
- 3、部署训练
- 4、训练网络
- 5、测试网络
- 完整程序(最好安装MATLAB最新版本、有GPU)
- 三、补充对某初学者疑问的回答
-
- 问题1、卷积核是怎么设置的?
- 问题2、为什么一定要有非线性激活函数
前言
在上一篇神经网络发展大事记中,我们已经知道了1998年的经典卷积神经网络LeNet-5实现了手写数字识别,非常适合初学者入门学习,而MATLAB又自带minist数据集、配备了强大的库(许多初学者光是配环境就卡很久)。
本篇仅使用一个MATLAB脚本来完成题目,并结合程序介绍相关原理。
提示:以下是本篇文章正文内容,下面案例可供参考
一、LeNet-5简要原理
如果恰好有10个特征能映射0~9个数字,就能直接完成分类。但实际上对机器来说并不能这样一步到位,而是从初级的特征,比如像素在空间上的轮廓分布:(图为LeNet-5结构示意图)
然后再到点的有规律分布,比如:“横”、“竖”、“撇”、“捺”这些高级特征,再到这些高级特征的组合形成更高级的特征来识别数字。卷积神经网络,可以很好地胜任逐层级的特征学习任务。
输入层:输入图像。
卷积层:提取特征。6个不同的卷积核就能提取6种特征。
池化层:减轻运算、协助学习。
再次卷积并池化,得到更高级的特征。
全连接层:将前层特征展成1维向量,向量中被激活的分量组成最高级特征。
softmax层:接受向量输入,输出每个类别的概率分布。
二、LeNet-5详细原理与MATLAB编程过程(完整程序于本节末)
1.导入minist数据集
minist数据集是一个开源的经典的手写数字数据集,包含了6w个训练样本和1w个测试样本,每个样本都是28x28的灰度图(0~9),常用于训练和测试图像分类算法。MATLAB自带的
代码如下(示例):
%% 步骤 1: 导入数据集
folderPath = 'E:\matlabR2023b\toolbox\nnet\nndemos\nndatasets\DigitDataset';
imds = imageDatastore(folderPath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
你电脑上安装的MATLAB也会自带这个数据集,替换成你电脑的路径上去即可。imageDatastore命令帮助导入图像数据。其中,IncludeSubfolders指定包含子文件夹,LabelSource设置为’foldernames’则将文件夹名作为标签。
然后可以选择抽查其中的一部分图片:
figure,
numImages=10000;
perm=randperm(numImages,20);
for i=1:1:20
subplot(4,5,i);
imshow(imds.Files{
perm(i)});
end
运行后如下:
为了训练与测试,需要将导入的数据集imds划分为训练集和测试集:
[imdsTrain, imdsTest] = splitEachLabel(imds, 0.8, 'randomize');
splitEachLabel命令用于分割数据集为训练集和测试集,0.8表示训练集占80%,剩余的为测试集。
2.设计改进版LeNet-5结构
基于LeNet-5的网络模型稍作改进,使用的网络结构(analyzeNetwork(net);即可绘制之)如下:
如图,我们设计了比LeNet-5(提出于1998年)改进的网络,使用了ReLu激活函数(提出于2011年),并再卷积后进行了批归一化可以帮助正规化卷积提取的特征,这样做有助于网络的后续层更加稳定和快速地学习。省略批归一化层可能会导致训练过程不稳定,收敛速度慢,甚至无法收敛。
许多初学者听说过激活函数、激活值。狭义上的激活值是被激活函数处理后的输出结果,同时也往往是下一层神经元的输入。如果没有激活函数的激活值,就是线性的。
这个表中有一竖着的栏为“激活”,这里的激活是只一层神经元的输出,之所以叫“激活”,是因为模仿生物学上神经元兴奋,兴奋就是被激活了,这一栏的内容是激活值矩阵(即每一层的输出值)。比如输入层imageinput的“激活”这一栏为28(S)x28(S)x 1(C) x1(B),这是因为输入灰度图像尺寸为28x28,灰度的通道(channel)=1,如果是RGB则其通道数为3。
通道是初学者需要掌握的基础概念,简而言之,1个通道1个特征用1个卷积核。通道就是数据中表示某类特征信息的维度,每个通道都可以看作专注于提取一类特征的检测器。
续上一节,源码如下:
% 步骤 2: 定义LeNet网络结构
% 需事先安装MATLAB深度学习工具箱,特别是Deep Learning Toolbox
layers = [
imageInputLayer([28 28 1], 'Name', 'input')
convolution2dLayer(5, 6,