当前位置: 首页 > 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.jsqmd.com/news/182097/

相关文章:

  • ComfyUI集成Sonic数字人视频生成全流程详解
  • 还在熬夜赶论文?9款AI神器免费搞定,效率飙升300%!
  • 揭秘Java向量API跨平台兼容性问题:5大关键适配方案全面解读
  • 大学生创业辅导:孵化器提供VoxCPM-1.5-TTS-WEB-UI商业计划书朗读服务
  • Java模块化类加载与字节码操作:深入JVM底层的文件读写原理(内部资料)
  • 【JavaDoc Markdown写作秘籍】:掌握高效文档编写的5大核心技巧
  • 社保缴费查询:老年人拨打12333收听VoxCPM-1.5-TTS-WEB-UI余额播报
  • 犯罪心理重建:警方用VoxCPM-1.5-TTS-WEB-UI复现嫌疑人内心独白
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的的商品标签识别系统(Python+PySide6界面+训练代码)
  • 战争创伤治疗:退伍军人通过VoxCPM-1.5-TTS-WEB-UI重构记忆叙述
  • 【专家级架构设计】:基于Kafka Streams的反应式微服务适配实践
  • 户籍迁移指南:派出所提供VoxCPM-1.5-TTS-WEB-UI所需材料清单朗读
  • 还在依赖堆内存?Java外部内存API让你性能提升300%
  • 医疗导诊AI助手来了!基于Sonic的数字人应用案例
  • 特殊儿童干预:自闭症患儿通过VoxCPM-1.5-TTS-WEB-UI建立沟通桥梁
  • pgAdmin 4 高危漏洞利用分析:CVE-2025-12762 认证RCE PoC详解
  • AugmentCode续杯插件完整使用指南:高效创建无限测试账户的终极解决方案
  • 《创业之路》-784-要用战术上的勤奋,来掩盖战略上的懒惰
  • 如何用Project Reactor提升Kafka Streams性能?(反应式适配优化秘籍)
  • 社会实验项目:街头装置邀请路人与VoxCPM-1.5-TTS-WEB-UI对话反思科技
  • 学霸同款9个AI论文写作软件,专科生搞定毕业论文不求人!
  • 【KubeEdge边云协同核心解密】:深入剖析数据同步机制与实战优化策略
  • 从日志堆积到秒级响应:Java微服务智能运维转型全记录
  • 导师严选9个一键生成论文工具,自考学生轻松搞定论文写作!
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的的机械器件识别系统(Python+PySide6界面+训练代码)
  • 为什么你的Java解析器扛不住百万级物联网数据?真相曝光
  • 学术会议筹备:组委会使用VoxCPM-1.5-TTS-WEB-UI生成日程语音公告
  • 畜牧健康监测:奶牛发情期由VoxCPM-1.5-TTS-WEB-UI向牧场主报告
  • 外交辞令分析:国际关系专家用VoxCPM-1.5-TTS-WEB-UI解构演讲潜台词
  • 为什么90%的Java故障排查失败?因为你没用对智能日志分析方法