首页IT科技matlab卷积神经网络代码(Matlab深度学习入门实例:从0搭建卷积神经网络CNN(附完整代码))

matlab卷积神经网络代码(Matlab深度学习入门实例:从0搭建卷积神经网络CNN(附完整代码))

时间2025-04-30 16:14:24分类IT科技浏览5132
导读:网上已具有大量卷积神经网络的讲解,故本文不在对此赘述,这篇文章针对已了解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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
Centos安装libelf-devel(CentOS 5.4 安裝 boost 1.4.1 筆記 杨毅的电子笔记) linux命令行复制文件夹(10+常用Linux命令行处理文件复制和目录复制)