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

Matlab卷积神经网络对一维信号进行二分类及多分类的源码详解与实例:从数据加载到混淆矩阵的绘制

Matlab使用CNN(卷积神经网络)对一维信号(如语音信号、心电图信号)进行二分类源程序。 也可以改成多分类。 会提供原始数据,数据可直接替换为自己的数据运行,注释详细 工作如下: 1、加载数据,一共为200个正常样本和200个异常样本,训练集为80%,即160正常和160异常,一共320条数据;测试集为40正常和40异常,一共80条数据。 2、构建一维CNN架构,层数为两层。 3、构建options。 4、训练。 5、测试,并绘制混淆矩阵。 注:考虑到使用Matlab对一维信号进行CNN分类的教程较少,此程序是为了方便学习怎么搭建网络、测试等等,使用的数据量较少,并且数据本身也易于分类,自己换成自己的数据时可能需要根据实际情况调整网络。

最近在折腾一维信号的分类问题,发现用Matlab搞CNN分类的现成代码确实不多。正好手头有个自用的基础框架,拿过来改改就能跑,特别适合刚入门的同学理解整个流程。下面直接上硬货,咱们边看代码边聊注意事项。

先准备数据这事儿挺关键。假设你的数据已经整理成【样本数×信号长度】的矩阵,比如每个样本是1000个采样点的一维信号:

% 加载数据(这里假装已经load好了) normal_data = randn(200, 1000); % 200个正常样本 abnormal_data = randn(200, 1000); % 200个异常样本 % 打乱顺序防止批次偏差 shuffled_idx = randperm(400); all_data = [normal_data; abnormal_data]; all_labels = [ones(200,1); zeros(200,1)]; all_data = all_data(shuffled_idx, :); all_labels = all_labels(shuffled_idx, :); % 切分训练测试集 train_x = all_data(1:320, :); train_y = all_labels(1:320, :); test_x = all_data(321:end, :); test_y = all_labels(321:end, :); % 转成matlab需要的格式(样本数×1×长度×通道数) train_x = reshape(train_x, [320,1,1000,1]); test_x = reshape(test_x, [80,1,1000,1]);

这里有个坑要注意:如果你的信号长度不一致,得先做插值或者截断对齐。我之前处理心电信号时就遇到过这个问题,最后用动态时间规整解决的。

接下来是网络结构搭建,这里用两层卷积+池化的经典组合:

layers = [ imageInputLayer([1 1000 1], 'Name', 'input') % 输入层 convolution2dLayer([1 15], 16, 'Padding', 'same', 'Name', 'conv1') % 一维卷积 batchNormalizationLayer reluLayer maxPooling2dLayer([1 5], 'Stride', [1 3], 'Name', 'pool1') % 一维池化 convolution2dLayer([1 10], 32, 'Padding', 'same', 'Name', 'conv2') batchNormalizationLayer reluLayer maxPooling2dLayer([1 5], 'Stride', [1 3], 'Name', 'pool2') globalAveragePooling2dLayer fullyConnectedLayer(2) softmaxLayer classificationLayer];

这里有两个骚操作:

  1. 用imageInputLayer处理一维信号,本质是把单通道当作二维的特殊情况
  2. 全局平均池化替代全连接层,实测能有效防止过拟合,尤其在小样本场景下

训练参数配置直接影响收敛速度,新手建议先用默认参数试水:

options = trainingOptions('adam', ... 'MaxEpochs', 30, ... 'MiniBatchSize', 32, ... 'ValidationData', {test_x, categorical(test_y')}, ... 'ValidationFrequency', 10, ... 'Verbose', true, ... 'Plots', 'training-progress');

重点说下ValidationFrequency设置。当你的训练集很大时,可以适当调高这个值加快训练。但咱们这个例子数据量小,设为10刚好能在每个epoch验证两次。

训练启动就一行代码:

net = trainNetwork(train_x, categorical(train_y'), layers, options);

跑起来后盯着训练曲线看,如果验证集准确率早早就到95%以上但训练集还在涨,八成是过拟合了。这时候可以试试在卷积层后面加Dropout层,比如设置0.5的丢弃率。

测试环节要关注实际应用场景的需求:

% 预测并计算指标 pred_labels = classify(net, test_x); accuracy = sum(pred_labels == categorical(test_y'))/numel(test_y) % 混淆矩阵可视化 plotconfusion(categorical(test_y'), pred_labels) set(gca, 'XTickLabel', {'正常','异常'}) set(gca, 'YTickLabel', {'正常','异常'}) % 计算ROC曲线(需要深度学习工具箱) [~,scores] = predict(net,test_x); [X,Y,T,AUC] = perfcurve(test_y', scores(:,2), 1); figure; plot(X,Y); xlabel('假阳性率'); ylabel('真阳性率')

遇到过特别有意思的情况:某次测试准确率高达99%,但实际部署时效果差,后来发现是测试集分布和真实场景不一致。所以建议在代码里预留数据增强的接口,比如加噪声、时移等操作。

最后说说工程化改进方向:

  1. 改用小波变换后的特征作为输入,对非平稳信号效果更好
  2. 在第一个卷积层后加残差连接,处理长程依赖
  3. 用贝叶斯优化自动调参
  4. 部署时改用C++接口加速推理

这个框架改成多分类也简单,把最后的全连接层输出改成类别数,损失函数换成交叉熵就行。完整代码已打包放在Github(假装有链接),换自己的数据时注意调整输入层的信号长度参数。遇到问题欢迎评论区交流,看到都会回~

http://www.gsyq.cn/news/198429.html

相关文章:

  • 【JavaDoc Markdown写作秘籍】:掌握高效文档编写的5大核心技巧
  • 犯罪心理重建:警方用VoxCPM-1.5-TTS-WEB-UI复现嫌疑人内心独白
  • 社保缴费查询:老年人拨打12333收听VoxCPM-1.5-TTS-WEB-UI余额播报
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的的商品标签识别系统(Python+PySide6界面+训练代码)
  • 还在依赖堆内存?Java外部内存API让你性能提升300%
  • 特殊儿童干预:自闭症患儿通过VoxCPM-1.5-TTS-WEB-UI建立沟通桥梁
  • 学霸同款9个AI论文写作软件,专科生搞定毕业论文不求人!
  • 社会实验项目:街头装置邀请路人与VoxCPM-1.5-TTS-WEB-UI对话反思科技
  • 如何用Project Reactor提升Kafka Streams性能?(反应式适配优化秘籍)
  • 导师严选9个一键生成论文工具,自考学生轻松搞定论文写作!
  • 学术会议筹备:组委会使用VoxCPM-1.5-TTS-WEB-UI生成日程语音公告
  • 畜牧健康监测:奶牛发情期由VoxCPM-1.5-TTS-WEB-UI向牧场主报告
  • 《创业之路》-785-段永平如何阐述战略与战术的关系
  • 物联网数据解析性能提升300%?Java工程师都在用的优化技巧
  • 3种高性能Java类文件读写方案曝光,第2种90%的人不知道
  • 儿童疫苗接种:社区医院用VoxCPM-1.5-TTS-WEB-UI通知下一次注射时间
  • 灵魂上传争议:VoxCPM-1.5-TTS-WEB-UI能否真正继承人类情感表达?
  • Java 24结构化并发异常处理深度剖析(专家级避坑指南)
  • 向量计算性能翻倍的秘密,Java SIMD平台适配全路径详解
  • 量子力学科普:复杂概念由VoxCPM-1.5-TTS-WEB-UI用比喻方式讲解
  • 165_尚硅谷_顺序查找
  • 车辆年检预约:车主收到VoxCPM-1.5-TTS-WEB-UI自动生成的检验安排
  • 揭秘Java外部内存API:5大使用场景与最佳实践详解
  • 电力抢修通知:停电区域居民收到VoxCPM-1.5-TTS-WEB-UI语音短信
  • 【Java智能运维日志分析实战】:掌握高效日志解析与异常预警核心技术
  • springboot基于微信小程序的校园爱心捐赠平台的设计与实现
  • ❼⁄₄ ⟦ OSCP ⬖ 研记 ⟧ 查找漏洞的公共利用 ➱ 实操案例(上) - 实践
  • 【限时推荐】Python缓存自动清理设计模式:让应用内存长期稳定运行
  • 快递物流追踪:收件人接听VoxCPM-1.5-TTS-WEB-UI生成的派送进度播报
  • 学术开题“神器”大揭秘:宏智树AI如何让你的开题报告“一键起飞”