news 2026/4/16 21:29:34

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/4/16 19:59:18

2024年CSDN重磅技术趋势全景图

CSDN年度技术趋势预测文章大纲技术趋势概述全球及中国技术发展的宏观背景过去一年技术领域的突破性进展未来技术发展的核心驱动力人工智能与机器学习大模型(如GPT、LLaMA)的持续演进与应用落地多模态AI技术的商业化场景拓展边缘AI与轻量化模型的普及云计…

作者头像 李华
网站建设 2026/4/16 11:11:52

为什么你的Java系统需要ML-KEM,密钥封装实现细节首次公开

第一章:为什么你的Java系统需要ML-KEM随着量子计算的快速发展,传统公钥加密算法如RSA和ECC正面临前所未有的安全威胁。量子计算机能够在多项式时间内破解基于大数分解或离散对数难题的密码体系,这使得当前广泛使用的加密机制在未来可能不再安…

作者头像 李华
网站建设 2026/4/16 12:44:14

ELK+AI如何重塑Java运维?深度解读智能日志分析系统构建全过程

第一章:Java 智能运维日志分析概述在现代分布式系统架构中,Java 应用广泛应用于企业级服务,伴随系统复杂度提升,传统人工排查日志的方式已无法满足高效运维需求。智能运维日志分析通过结合机器学习、自然语言处理与大数据技术&…

作者头像 李华
网站建设 2026/4/16 13:06:55

面对量子威胁你准备好了吗,Java平台ML-KEM集成实战指南

第一章:面对量子威胁你准备好了吗,Java平台ML-KEM集成实战指南随着量子计算的快速发展,传统公钥加密体系如RSA和ECC面临被破解的风险。NIST推出的ML-KEM(Module-Lattice Key Encapsulation Mechanism)作为后量子密码标…

作者头像 李华
网站建设 2026/4/15 19:36:09

告别OOM:Java外部内存API高效使用指南,提升系统稳定性

第一章:告别OOM:Java外部内存API的演进与核心价值Java应用在处理大规模数据时,频繁遭遇OutOfMemoryError(OOM),尤其是在堆内存受限或数据序列化开销巨大的场景下。传统的堆内内存管理模型已难以满足高性能、…

作者头像 李华
网站建设 2026/4/16 13:07:13

户籍迁移指南:派出所提供VoxCPM-1.5-TTS-WEB-UI所需材料清单朗读

户籍迁移指南:派出所提供VoxCPM-1.5-TTS-WEB-UI所需材料清单朗读 在各地派出所的办事大厅里,每天都有大量群众前来咨询户籍迁移的相关流程。过去,这类信息主要依赖窗口工作人员口头讲解或张贴纸质公告,不仅重复劳动强度大&#xf…

作者头像 李华