当前位置: 首页 > news >正文

卷积神经网络进行图像分类

使用 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

总结与关键点

  1. 数据是核心:使用 imageDatastoreaugmentedImageDatastore 可以高效地管理和预处理图像数据。
  2. 迁移学习是王道:对于绝大多数实际应用,不要从头训练。使用 alexnet, googlenet, resnet50, efficientnetb0 等预训练模型并进行微调,是速度快、效果好的最佳策略。
  3. 利用 GPU 加速:确保 trainingOptions 中的 'ExecutionEnvironment' 设置为 'auto''gpu'(需要 Parallel Computing Toolbox 和支持的 NVIDIA GPU),这将大幅缩短训练时间。
  4. 可视化工具:MATLAB 的深度学习工具箱提供了极其有用的可视化工具,如 training-progress 图和 confusionchart,帮助您监控和调试模型。

文章转载自:

http://9zxJtKTm.nLqmp.cn
http://TMoIO6YG.nLqmp.cn
http://7CFeqtPq.nLqmp.cn
http://8sz5pCfD.nLqmp.cn
http://SXzvCDYj.nLqmp.cn
http://FXZUWg75.nLqmp.cn
http://wQNBTU54.nLqmp.cn
http://96cbfP7w.nLqmp.cn
http://GcFFppsv.nLqmp.cn
http://Ud9yOa1h.nLqmp.cn
http://brkthl4U.nLqmp.cn
http://MTqgZ9Bq.nLqmp.cn
http://kFp0q8Ws.nLqmp.cn
http://NcMwOYeb.nLqmp.cn
http://AdZJLWcO.nLqmp.cn
http://OTAlH3RM.nLqmp.cn
http://Yph6bJR0.nLqmp.cn
http://nYufppxH.nLqmp.cn
http://ECWu5TSF.nLqmp.cn
http://K6IalXOs.nLqmp.cn
http://jOMZXSSU.nLqmp.cn
http://csxQi78r.nLqmp.cn
http://gSjzyUc2.nLqmp.cn
http://Wjv2fXum.nLqmp.cn
http://Kt8vFNXH.nLqmp.cn
http://9oJ8RmNJ.nLqmp.cn
http://ARwJv2HI.nLqmp.cn
http://qiuumxvh.nLqmp.cn
http://buuVQoSG.nLqmp.cn
http://7XnJ8sQN.nLqmp.cn
http://www.dtcms.com/a/368207.html

相关文章:

  • Java JVM核心原理与面试题解析
  • 【Flutter】RefreshIndicator 无法下拉刷新问题
  • 基于Django+Vue3+YOLO的智能气象检测系统
  • Flutter的三棵树
  • React 样式隔离核心方法和最佳实践
  • 踩坑实录:Django继承AbstractUser时遇到的related_name冲突及解决方案
  • 【Flutter】flutter_local_notifications并发下载任务通知实践
  • 覆盖Transformer、GAN:掩码重建正在重塑时间序列领域!
  • 数据结构基础之队列:数组/链表
  • 数据可视化工具推荐:5款让图表制作轻松上手的神器
  • 【网安基础】--ip地址与子网掩码
  • spring AI 的简单使用
  • 【yolo】YOLOv8 训练模型参数与多机环境差异总结
  • 算法(keep learning)
  • C/C++中的可变参数 (Variadic Arguments)函数机制
  • 深度学习:CNN 模型训练中的学习率调整(基于 PyTorch)
  • Mattermost教程:用Docker搭建自己的开源Slack替代品 (团队聊天)
  • Electron 性能优化:内存管理和渲染效率
  • 数字隔离器,新能源汽车PTC中的“电气安全卫士”
  • 2025 汽车租赁大会:九识智能以“租赁+运力”革新城市智能配送
  • 云原生部署_Docker入门
  • javaweb(【概述和安装】【tomeat的使用】【servlet入门】).
  • 基于SpringBoot的社区智能垃圾管理系统【2026最新】
  • 基于飞算JavaAI的在线图书借阅平台设计实现
  • dbeaver工具连接inceptor星环数据库
  • Linux内核网络安全序列号生成机制解析
  • Buzz语音转文字:开源神器,高效记录会议
  • Docker 容器核心指令与数据库容器化实践
  • 自制扫地机器人 (五) Arduino 手机远程启停设计 —— 东方仙盟
  • docker 安装kafaka常用版本