Matlab深度学习入门实例:从0搭建卷积神经网络CNN(附完整代码)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
网上已具有大量卷积神经网络的讲解故本文不在对此赘述这篇文章针对已了解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)