用MATLAB实现卷积神经网络CNN,并用于Mnist数据集分类,识别图像
时间: 2023-06-15 15:06:32 浏览: 209
以下是使用MATLAB实现卷积神经网络CNN并用于Mnist数据集分类的步骤:
1. 导入Mnist数据集
Mnist数据集是一个手写数字的数据集,包含了60,000张训练图片和10,000张测试图片,每张图片大小为28x28。可以通过MATLAB内置函数 `digitDataset` 来导入Mnist数据集。
```
% 导入Mnist数据集
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
'nndatasets','DigitDataset');
digitData = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
```
2. 划分训练集和测试集
使用 `splitEachLabel` 函数来划分训练集和测试集,将60,000张训练图片划分为50,000张训练图片和10,000张验证图片。
```
% 划分训练集和测试集
[trainDigitData,testDigitData] = splitEachLabel(digitData,0.8,'randomized');
```
3. 定义卷积神经网络
使用 `convolution2dLayer` 函数来定义卷积层,使用 `maxPooling2dLayer` 函数来定义池化层,使用 `fullyConnectedLayer` 函数来定义全连接层,使用 `softmaxLayer` 函数来定义输出层。然后将这些层堆叠起来,使用 `layerGraph` 函数来定义卷积神经网络。
```
% 定义卷积神经网络
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20,'Padding',0)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,50,'Padding',0)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(500)
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
lgraph = layerGraph(layers);
```
4. 训练卷积神经网络
使用 `trainingOptions` 函数来定义训练选项,包括学习率、最大训练轮数、每轮训练的批次大小等。然后使用 `trainNetwork` 函数来训练卷积神经网络。
```
% 训练卷积神经网络
options = trainingOptions('adam', ...
'InitialLearnRate',0.0001, ...
'MaxEpochs',20, ...
'MiniBatchSize',128, ...
'ValidationData',testDigitData, ...
'ValidationFrequency',10, ...
'Verbose',false, ...
'Plots','training-progress');
net = trainNetwork(trainDigitData,lgraph,options);
```
5. 测试卷积神经网络
使用 `classify` 函数来测试卷积神经网络,将测试图片输入卷积神经网络中,得到对应的输出结果。
```
% 测试卷积神经网络
testLabels = classify(net,testDigitData);
accuracy = sum(testLabels == testDigitData.Labels)/numel(testLabels);
fprintf('准确率为%.2f%%。\n',accuracy*100);
```
完整的代码如下:
```
% 导入Mnist数据集
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
'nndatasets','DigitDataset');
digitData = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
% 划分训练集和测试集
[trainDigitData,testDigitData] = splitEachLabel(digitData,0.8,'randomized');
% 定义卷积神经网络
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20,'Padding',0)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,50,'Padding',0)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(500)
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
lgraph = layerGraph(layers);
% 训练卷积神经网络
options = trainingOptions('adam', ...
'InitialLearnRate',0.0001, ...
'MaxEpochs',20, ...
'MiniBatchSize',128, ...
'ValidationData',testDigitData, ...
'ValidationFrequency',10, ...
'Verbose',false, ...
'Plots','training-progress');
net = trainNetwork(trainDigitData,lgraph,options);
% 测试卷积神经网络
testLabels = classify(net,testDigitData);
accuracy = sum(testLabels == testDigitData.Labels)/numel(testLabels);
fprintf('准确率为%.2f%%。\n',accuracy*100);
```
阅读全文