10分钟学会matlab实现cnn图像分类
整体代码
链接:https://pan.baidu.com/s/1btnY-jZXMK9oj3ZQxDvz8g
提取码:k4v8
可以打开代码,我来一步一步为你讲解,每步的含义,还有你该如何使用!
目录
1.为了便于理解,这里说一些基本概念,会的直接跳过程序在后面
1.1 通道数
1.2 全连接层
1.3边缘检测(卷积的核心部分)
1.4 丢弃法(Dropout Method)
1.5 softmax(多分类器)
2.通过Matlab实现一个简单的卷积神经网络分类
2.1加载数据
2.2划分数据集
2.3定义网络框架(这里建议看下视频在文章顶部)
2.4 网络训练
2.5测试网络进行准确率预测
1.为了便于理解,这里说一些基本概念,会的直接跳过程序在后面
1.1 通道数
我们每张图片由红绿蓝三种颜色组成,导入的时候对应红绿蓝三种颜色的通道,也就是三个矩阵,这三个矩阵分别表示对应红绿蓝像素的强弱值。
1.2 全连接层
将卷积最后的到的矩阵拉成一个一维矩阵,然后就是最简单的神经网络模式的一层到层,中间由权重相连接。
1.3边缘检测(卷积的核心部分)
边缘检测主要是利用卷积核进行图片特征提取,比如有通过竖直边缘检测的,或者水平边缘检
丢弃法(Dropout Method)
对于一个神经层y = f(Wx+b),引入一个丢弃函数d(·)使得y = f(Wd(x)+b)。
其中 m ∈ {0,1}^d 是丢弃掩码(dropout mask),通过以概率为p的贝努力分布随机生成。
(以上图片和概念来自于邱老师的神将网络ppt正则化那一章)
简言之就是通过节点的不完全调用,进行正则化,目的就是防止模型过拟合
1.5 softmax(多分类器)
如果使用Softmax回归分类器,相当于网络最后一层设置C 个神经元,其输出经过Softmax函数进行归一化后可以作为每个类的条件概率。
就是得到每种事件发生的概率输出出来,然后和class一起确定类别
2.通过Matlab实现一个简单的卷积神经网络分类
这里是matlab中提供的一个卷积图像分类的例子,我来详细的模型的每一步怎么来的进行一下解释,并说明下我们如何根据自己的数据集进行设置
2.1加载数据
将数字样本数据加载为图像数据存储。
这里加注释的一行为添加文件地址,我们在单引号中间可以加上‘c:’这样就代表c盘,后面的单引号点击到中间就可选择地址了。
imageDatastore 函数根据文件夹名称自动对图像加标签。
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
'nndatasets','DigitDataset');
% digitDatasetPath = fullfile('','','','','');
imds = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true, ...
'LabelSource','foldernames');
打开数据集里面是这样的,文件名就是标签,里面是手写数字的数据
这里的标签没必要一定是数字,像我在做的时候里面是对应的故障分类名称的英语,中文我没试过,感觉大多数都不支持。
2.2划分数据集
将数据划分为训练数据集和验证数据集,以使训练集中的每个类别包含 750 个图像,并且验证集包含对应每个标签的其余图像。splitEachLabel 将图像数据存储拆分为两个新的数据存储以用于训练和验证。
这里750是划分为训练集的个数,这里需要注意,这个数不要大于你每个文件夹中的最小数目,不然会报错,后面的randomize就是在这里面随机取,不用你再手动进行打乱很方便。
numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
2.3定义网络框架(这里建议看下视频在文章顶部)
定义卷积神经网络架构。指定网络输入层中图像的大小以及分类层前面的全连接层中类的数量。每个图像为 28×28×1 像素,有 10 个类。
inputSize = [28 28 1];
numClasses = 10;
layers = [
imageInputLayer(inputSize)
convolution2dLayer(5,20)
batchNormalizationLayer
reluLayer
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer];
这里通过matlab工具箱可以通过模块化设计来写网络结构不需要敲代码舒服的很
deepNetworkDesigner
在左侧命令窗口输入这个代码,就会打开这个编辑器
上面代码段里的网络结构就是把他做成这个样子
然后在上面点击生成代码就会得到我们上面代码段里面的网络结构。
然后是对网络参数的设定
在这里面对网络参数进行设定比如迭代次数,还有显示训练过程画图,等等,要是没有什么特别的需求可以直接用我这里设置的参数,要是训练结果不好,且每次都是现实训练到最大轮次而不是最小误差,这时可以改一改训练轮数
如果还有需要实现的功能可以通过在命令窗口输入 help trainingOptions打开设置文档,然后通过Ctrl+F快捷键查找你需要的功能按照这种‘功能名’‘参数’的格式添加在这里。
options = trainingOptions('sgdm', ...
'MaxEpochs',4, ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',30, ...
'Verbose',false, ...
'Plots','training-progress');
2.4 网络训练
net = trainNetwork(imdsTrain,layers,options);
括号里面分别是(训练数据,网络结构,训练参数)
然后训练的时候就会出现一下的训练图
上面是准确率,下面是计算损失也就是误差
2.5测试网络进行准确率预测
YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
三行代码分别是通过网络得到预测值,得到预测结果对应的标签,判断预测结果和真是标签相同的情况来计算准确率。