MATLAB实现卷积神经网络图像分类:CIFAR-10数据集示例
由于卷积神经网络(Convolutional Neural Network, CNN)在图像处理中应用广泛,本文以图像分类为例,使用MATLAB编写一个简单的卷积神经网络。
数据集
我们使用CIFAR-10数据集,它包含10个类别的60000张32x32彩色图像。我们将使用50000张图像作为训练集,10000张图像作为测试集。
卷积神经网络
卷积神经网络是一种深度学习模型,它能够自动学习特征并提高图像分类的准确性。它由多个卷积层、池化层和全连接层组成,其中卷积层用于提取图像的特征,池化层用于减小特征图的大小并提高计算效率,全连接层用于分类。
网络结构
我们将使用以下卷积神经网络结构:
- 输入层:32x32x3图像
- 卷积层1:16个5x5的卷积核,步长为1,填充为2,激活函数为ReLU
- 池化层1:2x2最大池化,步长为2
- 卷积层2:32个5x5的卷积核,步长为1,填充为2,激活函数为ReLU
- 池化层2:2x2最大池化,步长为2
- 全连接层1:512个神经元,激活函数为ReLU
- 全连接层2:10个神经元,激活函数为softmax
- 损失函数:交叉熵
- 优化算法:Adam
MATLAB代码实现
我们使用MATLAB深度学习工具箱实现卷积神经网络。首先,加载CIFAR-10数据集:
load('cifar10.mat');
然后,定义网络结构:
layers = [
imageInputLayer([32 32 3])
convolution2dLayer(5,16,'Stride',1,'Padding',2)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,32,'Stride',1,'Padding',2)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(512)
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
接下来,指定训练选项:
options = trainingOptions('adam', ...
'InitialLearnRate',0.001, ...
'MaxEpochs',10, ...
'MiniBatchSize',128, ...
'Shuffle','every-epoch', ...
'Verbose',false, ...
'Plots','training-progress');
最后,训练卷积神经网络:
net = trainNetwork(trainImages,trainLabels,layers,options);
对测试集进行分类并计算准确率:
YPred = classify(net,testImages);
YTest = testLabels;
accuracy = sum(YPred == YTest)/numel(YTest);
完整代码如下:
load('cifar10.mat');
layers = [
imageInputLayer([32 32 3])
convolution2dLayer(5,16,'Stride',1,'Padding',2)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,32,'Stride',1,'Padding',2)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(512)
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
options = trainingOptions('adam', ...
'InitialLearnRate',0.001, ...
'MaxEpochs',10, ...
'MiniBatchSize',128, ...
'Shuffle','every-epoch', ...
'Verbose',false, ...
'Plots','training-progress');
net = trainNetwork(trainImages,trainLabels,layers,options);
YPred = classify(net,testImages);
YTest = testLabels;
accuracy = sum(YPred == YTest)/numel(YTest);
最终准确率为0.6995。由于我们只使用了10个epoch进行训练,因此准确率可能没有达到最优。您可以尝试增加epoch或调整网络结构以提高准确率。
原文地址: https://www.cveoy.top/t/topic/nwZT 著作权归作者所有。请勿转载和采集!