卷积神经网络进行图像分类
使用 MATLAB 及其强大的 深度学习工具箱 (Deep Learning Toolbox) 来构建和训练卷积神经网络(CNN)以进行图像分类。
与使用 Python 的 TensorFlow 或 PyTorch 相比,MATLAB 提供了一个非常直观和集成化的环境,特别适合原型设计、教学以及快速上手。
1. 准备工作:数据准备与预处理
在 MATLAB 中组织图像数据最方便的方式是使用 imageDatastore
对象。它能自动从文件夹结构中读取图像,并根据文件夹名称自动分配标签。
假设你的图像数据按以下结构组织:
myDataset/train/cat/cat001.jpgcat002.jpg...dog/dog001.jpgdog002.jpg...validation/cat/cat101.jpg...dog/dog101.jpg...
步骤 1: 创建 Image Datastore
% 指定训练和验证数据路径
imdsTrain = imageDatastore('myDataset/train', ...'IncludeSubfolders', true, ...'LabelSource', 'foldernames');imdsValidation = imageDatastore('myDataset/validation', ...'IncludeSubfolders', true, ...'LabelSource', 'foldernames');
步骤 2: 数据预处理与增强
使用 augmentedImageDatastore
来调整图像大小并进行实时数据增强,这能有效防止过拟合。
% 定义输入图像尺寸(必须与网络输入层大小匹配)
inputSize = [227 227 3]; % 例如 AlexNet 的输入尺寸% 创建增强的图像数据存储
augmenter = imageDataAugmenter( ...'RandRotation', [-20, 20], ... % 随机旋转 ±20 度'RandXReflection', true, ... % 随机水平翻转'RandXTranslation', [-10 10], ... % 随机水平平移'RandYTranslation', [-10 10]); % 随机垂直平移augimdsTrain = augmentedImageDatastore(inputSize(1:2), imdsTrain, ...'DataAugmentation', augmenter, ...'ColorPreprocessing', 'gray2rgb'); % 如果原图是灰度图,将其复制为3通道% 验证集通常不需要增强,只需调整大小
augimdsValidation = augmentedImageDatastore(inputSize(1:2), imdsValidation);
2. 定义卷积神经网络(CNN)架构
你有三种主要方法来定义网络结构:
方法一:使用预训练网络(迁移学习 - 推荐!)
这是最快、最有效的方法,尤其适用于数据量不大的情况。MATLAB 提供了许多经典的预训练模型。
% 加载预训练网络(例如 AlexNet, GoogLeNet, ResNet-50, EfficientNet等)
net = alexnet; % 或 googlenet, resnet50, efficientnetb0 等
% 使用 analyzeNetwork(net) 可以可视化网络结构% 修改网络以适配你的分类问题
% 1. 提取网络层结构
lgraph = layerGraph(net);% 2. 找到并替换最后的全连接层和输出层
% 查看原网络最后的层名
net.Layers(end) % 通常是输出层
net.Layers(end-2) % 通常是全连接层% 根据你的类别数量,定义新的全连接层和输出层
numClasses = numel(categories(imdsTrain.Labels));
newFCLayer = fullyConnectedLayer(numClasses, ...'Name', 'new_fc', ...'WeightLearnRateFactor', 10, ... % 让这层学得快一些'BiasLearnRateFactor', 10);
newOutputLayer = classificationLayer('Name', 'new_classoutput');% 3. 替换网络中的层
lgraph = replaceLayer(lgraph, 'fc8', newFCLayer); % 'fc8' 是 AlexNet 最后一全连接层名
lgraph = replaceLayer(lgraph, 'output', newOutputLayer); % 'output' 是 AlexNet 最后输出层名
% 不同预训练网络层名不同,需查看后修改
方法二:从 MATLAB 内置架构创建新网络
% 使用 MATLAB 预定义的轻量级网络,如 squeezenet
net = squeezenet;
lgraph = layerGraph(net);
% ... (同样需要修改最后的分类层)
方法三:从头开始自定义网络架构(适用于学习或特定需求)
layers = [% 输入层imageInputLayer(inputSize, 'Name', 'input')% 第一个卷积块convolution2dLayer(3, 32, 'Padding', 'same', 'Name', 'conv_1')batchNormalizationLayer('Name', 'bn_1')reluLayer('Name', 'relu_1')maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool_1')% 第二个卷积块convolution2dLayer(3, 64, 'Padding', 'same', 'Name', 'conv_2')batchNormalizationLayer('Name', 'bn_2')reluLayer('Name', 'relu_2')maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool_2')% 第三个卷积块convolution2dLayer(3, 128, 'Padding', 'same', 'Name', 'conv_3')batchNormalizationLayer('Name', 'bn_3')reluLayer('Name', 'relu_3')% 分类器部分fullyConnectedLayer(64, 'Name', 'fc_1')reluLayer('Name', 'relu_fc')fullyConnectedLayer(numClasses, 'Name', 'fc_final')softmaxLayer('Name', 'softmax')classificationLayer('Name', 'output')
];
3. 配置训练选项
使用 trainingOptions
函数来详细配置训练过程。
options = trainingOptions('sgdm', ... % 优化器: 'sgdm', 'rmsprop', 'adam''InitialLearnRate', 0.001, ... % 初始学习率'MaxEpochs', 15, ... % 训练轮数'Shuffle', 'every-epoch', ... % 每轮训练前打乱数据'ValidationData', augimdsValidation, ... % 指定验证集'ValidationFrequency', 50, ... % 每50次迭代验证一次'Verbose', true, ... % 在命令行显示训练过程'Plots', 'training-progress', ... % 显示训练进度图'MiniBatchSize', 32, ... % 批大小(根据GPU内存调整)'ExecutionEnvironment', 'auto'); % 'auto', 'gpu', 'cpu'。优先使用GPU加速
% 如果训练时出现内存不足错误,请减小 'MiniBatchSize'
4. 训练网络
使用 trainNetwork
函数开始训练。这会启动一个图形化窗口显示训练进度。
[netTrained, info] = trainNetwork(augimdsTrain, lgraph, options);
netTrained
: 训练好的网络。info
: 包含训练过程详细信息的结构体(如损失、准确率的历史记录)。
5. 评估与测试训练好的模型
在验证集/测试集上进行预测
% 使用训练好的网络对验证集进行预测
[YPred, scores] = classify(netTrained, augimdsValidation);% 提取真实标签
YValidation = imdsValidation.Labels;% 计算准确率
accuracy = mean(YPred == YValidation);
fprintf('Validation Accuracy: %.2f%%\n', accuracy * 100);
绘制混淆矩阵
figure
plotconfusion(YValidation, YPred) % 方法一:简单绘图% 方法二:使用 confusionchart (更推荐,更清晰)
figure
cm = confusionchart(YValidation, YPred);
cm.Title = 'Confusion Matrix for Validation Data';
cm.RowSummary = 'row-normalized'; % 按行显示百分比
cm.ColumnSummary = 'column-normalized';
对单张新图像进行分类
% 1. 读取图像
newImg = imread('path_to_your_image.jpg');% 2. 调整大小(必须与训练时输入尺寸一致)
newImgResized = imresize(newImg, inputSize(1:2));% 3. 进行分类
[label, score] = classify(netTrained, newImgResized);% 4. 显示图像及预测结果
figure
imshow(newImg)
title(['Predicted: ', char(label), ' (Confidence: ', ...num2str(max(score)*100, '%.2f'), '%)'])
推荐代码 卷积神经网络CNN进行图像分类 www.youwenfan.com/contentcsf/46145.html
总结与关键点
- 数据是核心:使用
imageDatastore
和augmentedImageDatastore
可以高效地管理和预处理图像数据。 - 迁移学习是王道:对于绝大多数实际应用,不要从头训练。使用
alexnet
,googlenet
,resnet50
,efficientnetb0
等预训练模型并进行微调,是速度快、效果好的最佳策略。 - 利用 GPU 加速:确保
trainingOptions
中的'ExecutionEnvironment'
设置为'auto'
或'gpu'
(需要 Parallel Computing Toolbox 和支持的 NVIDIA GPU),这将大幅缩短训练时间。 - 可视化工具:MATLAB 的深度学习工具箱提供了极其有用的可视化工具,如
training-progress
图和confusionchart
,帮助您监控和调试模型。