利用MATLAB进行深度学习图像分类是一个强大且相对直观的过程,即使是初学者也能在它的帮助下快速构建和部署模型。
MATLAB深度学习图像分类的主要步骤和涉及的核心函数:
步骤 | 核心函数/工具 | 功能描述 |
---|---|---|
数据准备与加载 | imageDatastore |
创建图像数据存储对象,自动从文件夹结构标签 |
splitEachLabel |
按比例划分训练集、验证集和测试集 | |
数据预处理与增强 | augmentedImageDatastore |
进行图像大小调整、归一化及数据增强(如旋转、翻转) |
构建网络模型 | 从头构建 | 使用imageInputLayer , convolution2dLayer , reluLayer 等逐层构建 |
迁移学习 | 使用googlenet , resnet50 等加载预训练模型 |
|
配置训练选项 | trainingOptions |
设置优化器、学习率、迭代次数、验证数据等参数 |
训练模型 | trainNetwork |
使用训练数据训练网络 |
评估模型性能 | classify |
对测试集进行分类预测 |
confusionmat |
计算分类准确率或混淆矩阵 | |
使用模型预测 | classify |
对新的单张图像或图像集进行预测 |
数据准备与预处理
良好的数据是成功训练模型的基础。
-
组织数据:将图像按类别放入不同的子文件夹,文件夹名称即为类别标签。例如:
dataset/train/cat/cat001.jpg...dog/dog001.jpg...validation/cat/...dog/...test/cat/...dog/...
这种方式可以利用
imageDatastore
自动获取标签。 -
加载数据:使用
imageDatastore
加载图像数据。imds = imageDatastore('path/to/your/data', ...'IncludeSubfolders', true, ...'LabelSource', 'foldernames');
-
划分数据集:将数据划分为训练集、验证集和测试集。
[imdsTrain, imdsValidation, imdsTest] = splitEachLabel(imds, 0.7, 0.15, 0.15, 'randomized');
-
数据预处理与增强:使用
augmentedImageDatastore
进行图像大小调整和增强,这有助于增加数据多样性,防止过拟合。imageSize = [224 224 3]; % 常见的网络输入大小,如ImageNet augimdsTrain = augmentedImageDatastore(imageSize, imdsTrain, ...'ColorPreprocessing', 'gray2rgb', ... % 如果原图是灰度图,转换为RGB三通道'DataAugmentation', imageDataAugmenter('RandRotation',[-20,20], ... % 随机旋转'RandXReflection', true, ... % 随机水平翻转'RandXTranslation',[-10 10], 'RandYTranslation',[-10 10])); % 随机平移
对于验证集和测试集,通常只进行调整大小和归一化,不需要数据增强。
构建深度学习模型
你可以选择从头开始构建一个卷积神经网络(CNN),或者使用迁移学习利用预训练模型。
-
从头构建CNN(适用于简单任务或数据量较小的情况):
layers = [imageInputLayer([28 28 1]) % 输入层,指定图像大小convolution2dLayer(3, 8, 'Padding', 'same') % 卷积层batchNormalizationLayer % 批归一化层reluLayer % ReLU激活层maxPooling2dLayer(2, 'Stride', 2) % 最大池化层convolution2dLayer(3, 16, 'Padding', 'same')batchNormalizationLayerreluLayerfullyConnectedLayer(10) % 全连接层,输出节点数对应类别数softmaxLayer % Softmax层classificationLayer]; % 分类层
这是一个简单的例子,你可以根据需要增加卷积层、全连接层等。
-
迁移学习(强烈推荐,尤其当你的数据量不是特别巨大时):
net = googlenet; % 加载预训练的GoogLeNet模型,其他可选如resnet50, efficientnetb0等 lgraph = layerGraph(net); % 获取网络层图 % 修改最后的全连接层和分类层以适应你的类别数 numClasses = numel(categories(imdsTrain.Labels)); newFCLayer = fullyConnectedLayer(numClasses, 'Name', 'new_fc'); newClassLayer = classificationLayer('Name', 'new_classoutput'); lgraph = replaceLayer(lgraph, 'loss3-classifier', newFCLayer); lgraph = replaceLayer(lgraph, 'output', newClassLayer); % 设置训练选项,通常微调时使用较小的学习率 options = trainingOptions('adam', ...'InitialLearnRate', 0.0001, ... % 微调时学习率通常设置较小... % 其他选项);
配置训练选项与训练模型
使用 trainingOptions
函数来配置训练参数。
options = trainingOptions('sgdm', ... % 优化算法,也可以是 'adam', 'rmsprop' 等'MaxEpochs', 10, ... % 最大训练轮数'MiniBatchSize', 32, ... % 小批量大小'InitialLearnRate', 0.001, ... % 初始学习率'ValidationData', augimdsValidation, ... % 指定验证数据'ValidationFrequency', 50, ... % 每隔多少迭代验证一次'Verbose', false, ... % 是否在命令行窗口显示训练过程'Plots', 'training-progress'); % 显示训练进度图
使用 trainNetwork
函数开始训练模型。
net = trainNetwork(augimdsTrain, layers, options); % 对于从头训练
% 或者对于迁移学习
net = trainNetwork(augimdsTrain, lgraph, options);
训练过程中,MATLAB会显示一个进度图,你可以实时观察训练集和验证集上的准确率和损失变化。
评估模型性能与进行预测
训练完成后,需要在独立的测试集上评估模型的最终性能。
% 对测试集图像进行分类预测
[YPred, scores] = classify(net, augimdsTest);
YTest = imdsTest.Labels; % 获取测试集的真实标签% 计算准确率
accuracy = mean(YPred == YTest);
fprintf('Test Accuracy: %.2f%%\n', accuracy * 100);% 绘制混淆矩阵来分析各类别的分类情况
figure;
confusionchart(YTest, YPred);
title('Confusion Matrix for Test Data');
训练好的模型可以用来预测新的图像。
% 预测单张图像
img = imread('path/to/your/new_image.jpg');
imgResized = imresize(img, net.Layers(1).InputSize(1:2)); % 调整到网络输入大小
[label, score] = classify(net, imgResized);% 显示图像及预测结果
figure;
imshow(img);
title(['Predicted: ', char(label), ', Confidence: ', num2str(max(score)*100, '%.2f'), '%']);
参考代码 运用深度学习模型实现图像的分类 www.youwenfan.com/contentcnh/55199.html
实用技巧与注意事项
- 数据是关键:数据质量、数量和多样性直接影响模型性能。数据增强是提升模型泛化能力的有效手段。
- 从迁移学习开始:除非你有海量数据,否则从预训练模型(如GoogLeNet、ResNet、EfficientNet等)开始进行微调,通常比从头训练更快、效果更好。
- 利用GPU加速:如果有GPU,MATLAB会自动尝试使用它来加速训练(需要Parallel Computing Toolbox)。
- 超参数调优:学习率(
InitialLearnRate
)、批量大小(MiniBatchSize
)、训练轮数(MaxEpochs
)等都是重要的超参数,需要根据实际情况调整。可以使用MATLAB的Experiment Manager App来系统地进行超参数调优。 - 理解过拟合:如果训练准确率很高但验证/测试准确率很低,模型很可能过拟合了。可以通过增加数据增强、添加Dropout层、使用L2正则化、减少模型复杂度或提前停止训练来缓解。
- 可视化与解释性:使用Grad-CAM等工具可视化网络关注图像的那些区域,有助于理解模型决策的依据和调试模型。
进阶探索
当你掌握了基本流程后,还可以探索:
- 使用深度网络设计器(Deep Network Designer)App:通过图形化界面拖拽方式设计、编辑和训练网络,非常适合初学者直观理解网络结构。
- 其他计算机视觉任务:如目标检测(使用
trainFasterRCNNObjectDetector
或trainYOLOv2ObjectDetector
)、语义分割等。 - 模型部署:将训练好的模型部署到嵌入式设备、企业系统或生成代码。