matlab卷积神经网络代码(Matlab深度学习入门实例:从0搭建卷积神经网络CNN(附完整代码))
网上已具有大量卷积神经网络的讲解 ,故本文不在对此赘述 ,这篇文章针对已了解CNN基础结构和原理者,以一个例子搭建一个简单的卷积神经网络 ,作为正式迈入深度学习的第一步 。
我们以深度学习最经典的案例——手写数字的识别 ,和一种经典的CNN——LeNet进行本次学习 。
Matlab的功能十分强大 ,其自带的深度学习工具箱可以使我们免于编写底层算法 ,迅速地搭建出一个卷积神经网络 ,同时 ,其自带手写数字图片以供学习 ,地址如下 ,笔者使用的是Matlab2022a。
我们将DigitDataset拷贝到当前编写代码的文件夹下 ,并删除其中包含两个Excel即可得到下列图片 。
第一步,加载手写数字样本图片 ,代码如下:
clear clc % 第一步:加载手写数字样本 imds = imageDatastore( ... DigitDataset, ... IncludeSubfolders,true, ... LabelSource,foldernames);IncludeSubfolders,true:包含每个文件夹中的所有文件和子文件夹;
LabelSource,foldernames:根据文件夹名称分配标签并储存在Labels属性中 。
第二步 ,将样本划分为训练集和测试集,并统计分类数量 ,代码如下:
% 第二步: % 将样本划分为训练集与测试集 [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7); % 统计训练集中分类标签的数量 numClasses = numel(categories(imdsTrain.Labels));imdsTrain为训练样本数据 ,imdsValidation为验证样本数据,0.7为训练样本的比例 。
第三步 ,构建LeNet并进行可视化分析 ,代码如下:
% 第三步:构建LeNET卷积网络并进行分析 % 构建LeNET卷积网络 LeNET= [ imageInputLayer([60 20 1],Name,input,Normalization,zscore) convolution2dLayer([5 5],6,Padding,same,Name,Conv1) maxPooling2dLayer(2,Stride,2,Name,Pool1) convolution2dLayer([5 5],16,Padding,same,Name,Conv2) maxPooling2dLayer(2,Stride,2,Name,Pool2) convolution2dLayer([5 5],120,Padding,same,Name,Conv3) fullyConnectedLayer(84,Name,fc1) fullyConnectedLayer(numClasses,Name,fc2) softmaxLayer( Name,softmax) classificationLayer(Name,output) ]; % 对构建的网络进行可视化分析 lgraph = layerGraph(LeNET); analyzeNetwork(lgraph)由于手写数字图片大小为60*20*1 ,故需调整输入层大小;
LeNet结构如下:
第一个卷积层:卷积核大小为5 ,数量为6 ,卷积方式为0填充;
第一个池化层:二维最大池化 ,区域为2 ,步长为2;
第二个卷积层:卷积核大小为5 ,数量为16 ,卷积方式为0填充;
第二个池化层:二维最大池化,区域为2 ,步长为2;
第三个卷积层:卷积核大小为5 ,数量为12,卷积方式为0填充;
第一个全连接层:输出大小为84;
第二个全连接层:输出大小为numClasses;
softmax层:得出全连接层每一个输出的概率;
classfication层:根据概率确定类别 。
analyzeNetwork可以使我们对网络进行可视化分析 ,该代码运行结果如下图:
第四步 ,调整训练集和输入集的图像大小使其与LeNet输入层相同,代码如下:
% 第四步:将训练集与验证集中图像的大小调整成与LeNet输入层的大小相同 inputSize = [60 20 1]; augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);该步骤在此例中可以省略 。
第五步:配置训练选项并对网络进行训练 ,代码如下:
% 第五步:配置训练选项并对网络进行训练 % 配置训练选项 options = trainingOptions(sgdm, ... InitialLearnRate,0.001, ... MaxEpochs,3, ... Shuffle,every-epoch, ... ValidationData,augimdsValidation, ... ValidationFrequency,30, ... Verbose,true, ... Plots,training-progress); % 对网络进行训练 net = trainNetwork(augimdsTrain,LeNET,options);训练选项如下:
训练方法为sgdm;
初始学习率为0.001;
最大轮数为3;
Shuffle,every-epoch: 在每一轮训练前打乱数据;
训练期间所用数据为augimdsValidation;
验证频率为30次/轮;
设置打开命令窗口输出;
设置打开训练进度图 。
我们可以看到训练进度如下图:
第六步:将训练好的网络用于对新的输入图像进行分类 ,并计算准确率
% 第六步:将训练好的网络用于对新的输入图像进行分类 ,并计算准确率 YPred = classify(net,augimdsValidation); YValidation = imdsValidation.Labels; accuracy = sum(YPred == YValidation)/numel(YValidation) figure confusionchart(YValidation,YPred)confusionchart可以产生混淆矩阵 ,以便我们更直观的看出LeNet验证的结果 。
可以看到预测结果准确度比较低 ,对此我们可以对LeNet进行改进 ,增加卷积 ,池化层或者使用更高级的AlexNet等神经网络进行训练 ,本例全部代码如下:
clear clc % 第一步:加载手写数字样本 imds = imageDatastore( ... DigitDataset, ... IncludeSubfolders,true, ... LabelSource,foldernames); % 第二步: % 将样本划分为训练集与测试集 [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7); % 统计训练集中分类标签的数量 numClasses = numel(categories(imdsTrain.Labels)); % 第三步:构建LeNET卷积网络并进行分析 % 构建LeNET卷积网络 LeNET= [ imageInputLayer([60 20 1],Name,input,Normalization,zscore) convolution2dLayer([5 5],6,Padding,same,Name,Conv1) maxPooling2dLayer(2,Stride,2,Name,Pool1) convolution2dLayer([5 5],16,Padding,same,Name,Conv2) maxPooling2dLayer(2,Stride,2,Name,Pool2) convolution2dLayer([5 5],120,Padding,same,Name,Conv3) fullyConnectedLayer(84,Name,fc1) fullyConnectedLayer(numClasses,Name,fc2) softmaxLayer(Name,softmax) classificationLayer(Name,output) ]; % 对构建的网络进行可视化分析 lgraph = layerGraph(LeNET); analyzeNetwork(lgraph) % 第四步:将训练集与验证集中图像的大小调整成与LeNet输入层的大小相同 inputSize = [60 20 1]; augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation); % 第五步:配置训练选项并对网络进行训练 % 配置训练选项 options = trainingOptions( ... sgdm, ... InitialLearnRate,0.001, ... MaxEpochs,3, ... Shuffle,every-epoch, ... ValidationData,augimdsValidation, ... ValidationFrequency,30, ... Verbose,true, ... Plots,training-progress); % 对网络进行训练 net = trainNetwork(augimdsTrain,LeNET,options); % 第六步:将训练好的网络用于对新的输入图像进行分类 ,并计算准确率 YPred = classify(net,augimdsValidation); YValidation = imdsValidation.Labels; accuracy = sum(YPred == YValidation)/numel(YValidation) figure confusionchart(YValidation,YPred)创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!