news 2026/7/2 3:52:49

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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(假装有链接),换自己的数据时注意调整输入层的信号长度参数。遇到问题欢迎评论区交流,看到都会回~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 8:50:42

Sonic数字人支持1080P高清输出,min_resolution设置建议1024

Sonic数字人支持1080P高清输出,min_resolution设置建议1024 在短视频内容爆炸式增长的今天,虚拟主播、AI教师、智能客服等数字人应用正以前所未有的速度渗透进我们的日常生活。用户对“真实感”的要求越来越高——不仅是嘴型要对得上声音,连微…

作者头像 李华
网站建设 2026/7/1 16:35:50

【国家级安全标准前瞻】:基于Java的ML-KEM封装实现技术内幕

第一章:ML-KEM标准与后量子密码演进随着量子计算技术的快速发展,传统公钥密码体系如RSA和ECC面临被高效破解的风险。为应对这一挑战,美国国家标准与技术研究院(NIST)启动了后量子密码(PQC)标准化…

作者头像 李华
网站建设 2026/7/1 22:12:18

掌握这4种模式,彻底打通飞算JavaAI需求描述瓶颈

第一章:飞算JavaAI需求描述优化的核心价值在现代软件开发中,需求描述的准确性与完整性直接影响项目的交付效率与系统稳定性。飞算JavaAI通过智能化语义解析与上下文理解能力,显著提升了Java项目中需求文档的转化质量,将模糊、非结…

作者头像 李华
网站建设 2026/7/1 8:50:58

释放JVM性能极限(外部内存API实战案例全公开)

第一章:释放JVM性能极限——外部内存API的革命性突破Java虚拟机(JVM)长期以来受限于堆内存管理机制,在处理大规模数据和高性能计算场景时面临GC停顿、内存溢出等瓶颈。随着Java 17正式引入外部内存API(Foreign Memory …

作者头像 李华
网站建设 2026/7/1 8:50:48

Java日志分析性能提升80%的秘密:百万级日志实时处理架构揭秘

第一章:Java日志分析性能提升80%的秘密:百万级日志实时处理架构揭秘 在高并发系统中,日志数据量呈指数级增长,传统的单机日志解析方式已无法满足实时性与吞吐量需求。构建一套高效、可扩展的百万级日志实时处理架构,成…

作者头像 李华
网站建设 2026/7/1 22:31:17

社保缴费查询:老年人拨打12333收听VoxCPM-1.5-TTS-WEB-UI余额播报

社保缴费查询:老年人拨打12333收听VoxCPM-1.5-TTS-WEB-UI余额播报 在城市社区服务中心的公告栏前,常常能看到这样的场景:几位老人拿着社保卡,眯着眼反复核对服务热线号码。对他们而言,智能手机操作复杂、APP界面字体太…

作者头像 李华