卷积神经网络的图像分类识别matlab代码
时间: 2023-11-16 19:46:41 浏览: 44
以下是使用 MATLAB 实现卷积神经网络进行图像分类识别的代码示例:
1. 加载数据
首先,需要将数据加载到 MATLAB 中。这里使用 CIFAR-10 数据集作为示例。可以使用以下代码将数据集下载到本地:
```matlab
url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz';
filename = 'cifar-10-matlab.tar.gz';
datafolder = 'cifar-10-batches-mat';
websave(filename,url);
untar(filename,datafolder);
```
然后,使用以下代码将训练集和测试集加载到 MATLAB 中:
```matlab
% 加载训练集
traindata = [];
trainlabels = [];
for i=1:5
filename = fullfile(datafolder,sprintf('data_batch_%d.mat',i));
load(filename);
traindata = [traindata; data];
trainlabels = [trainlabels; labels];
end
% 加载测试集
filename = fullfile(datafolder,'test_batch.mat');
load(filename);
testdata = data;
testlabels = labels;
```
2. 数据预处理
在训练模型之前,需要对数据进行预处理。这里使用的是简单的归一化处理,将像素值缩放到 [0,1] 范围内:
```matlab
% 数据归一化
traindata = double(traindata) / 255;
testdata = double(testdata) / 255;
```
3. 定义卷积神经网络模型
接下来,需要定义卷积神经网络模型。这里使用的是简单的 LeNet-5 模型:
```matlab
layers = [
imageInputLayer([32 32 3])
convolution2dLayer(5,6,'Padding','same')
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,16,'Padding','same')
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(120)
reluLayer
fullyConnectedLayer(84)
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
```
4. 指定训练选项
在训练模型之前,需要指定训练选项。这里使用的是随机梯度下降算法进行训练:
```matlab
options = trainingOptions('sgdm', ...
'MaxEpochs',20, ...
'InitialLearnRate',0.01, ...
'MiniBatchSize',128, ...
'Shuffle','every-epoch', ...
'Verbose',false, ...
'Plots','training-progress');
```
5. 训练模型
有了数据和模型,就可以开始训练模型了。使用以下代码可以训练模型:
```matlab
net = trainNetwork(traindata, categorical(trainlabels), layers, options);
```
6. 测试模型
训练完成后,可以使用以下代码对模型进行测试:
```matlab
predictedlabels = classify(net, testdata);
testaccuracy = sum(predictedlabels == categorical(testlabels)) / numel(testlabels);
fprintf('Test Accuracy: %f\n', testaccuracy);
```
完整的代码示例如下:
```matlab
% 下载数据集
url = 'https://www.cs.toronto.edu/~kriz/cifar-10-matlab.tar.gz';
filename = 'cifar-10-matlab.tar.gz';
datafolder = 'cifar-10-batches-mat';
websave(filename,url);
untar(filename,datafolder);
% 加载训练集
traindata = [];
trainlabels = [];
for i=1:5
filename = fullfile(datafolder,sprintf('data_batch_%d.mat',i));
load(filename);
traindata = [traindata; data];
trainlabels = [trainlabels; labels];
end
% 加载测试集
filename = fullfile(datafolder,'test_batch.mat');
load(filename);
testdata = data;
testlabels = labels;
% 数据归一化
traindata = double(traindata) / 255;
testdata = double(testdata) / 255;
% 定义卷积神经网络模型
layers = [
imageInputLayer([32 32 3])
convolution2dLayer(5,6,'Padding','same')
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,16,'Padding','same')
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(120)
reluLayer
fullyConnectedLayer(84)
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
% 指定训练选项
options = trainingOptions('sgdm', ...
'MaxEpochs',20, ...
'InitialLearnRate',0.01, ...
'MiniBatchSize',128, ...
'Shuffle','every-epoch', ...
'Verbose',false, ...
'Plots','training-progress');
% 训练模型
net = trainNetwork(traindata, categorical(trainlabels), layers, options);
% 测试模型
predictedlabels = classify(net, testdata);
testaccuracy = sum(predictedlabels == categorical(testlabels)) / numel(testlabels);
fprintf('Test Accuracy: %f\n', testaccuracy);
```