简介基于MATLAB的一维CNN识别系统设计资源面向信号处理、序列数据分类等方向的工程师与学习者解决一维序列数据的特征提取与模式识别问题。资源完整覆盖从数据获取到模型部署的整个流程getData.m负责加载data.mat并完成归一化、标准化等预处理trainCnn.m构建并训练1DCNN模型训练好的网络保存在cnnNet.mat与net.mat中可直接加载使用两份txt文件对训练参数和数据处理思路做了说明便于复现。压缩包共7个文件以mat、m、txt三类为主整体仅217KB轻量便携。目前已有388人学习使用。借助源码、模型及可视化GUI界面读者可系统掌握深度学习工具箱的调用方式理解卷积层、池化层、全连接层在序列任务中的配置逻辑以及超参数调优和模型保存的具体做法适合作为课程设计、毕业设计或1DCNN相关研究的参考。1. 一维CNN识别系统为什么值得用MATLAB从零搭一遍基于MATLAB的一维CNN识别系统应付的是很常见的一类问题输入是振动、电流、心电这类一维时间序列输出是故障或状态类别。过去要先做小波包分解或FFT提特征再送进BP神经网络拟合分类边界一维CNN把特征提取和分类合并成一步原始波形进、标签出。和把波形转成频谱图再走matlab图像处理的二维CNN路线相比一维卷积核只在时间轴滑动参数量小一个数量级普通CPU台式机就能训练。对设备健康管理这类看重可复现与交付速度的场景这套方案落地路径最短装好Deep Learning Toolbox数据整成规定格式几十行代码就能看到识别率曲线。2. MATLAB里一维CNN识别系统的网络层定义与参数核对2.1 一维卷积如何处理时序信号比BP好在哪一维CNN的卷积核是一个长度为k的向量在长度为N的信号上按步长滑动每个位置做一次内积输出长度保持N当Padding设为same时的特征图。这个操作只沿时间轴进行因此保留了“波形在哪个时刻长成什么样子”的信息多个卷积核等价于一组自动学出来的带通滤波器第一层输出的特征和小波包分解的频带分量很相似。相比之下BP神经网络做波形识别要先人工压缩特征比如均值、峰值、频段能量统计这个过程会把时间次序信息丢掉而且特征设计和分类器训练是两个独立环节改一个就要重做另一个。在强噪声、变工况场景里手工特征加BP的识别率往往卡在某个值上不去换成一维CNN之后反而能继续涨原因是卷积层自己在原始波形上找特征不需要人先判断该看哪个频段。这里讨论的一维CNN和LSTM也不冲突。LSTM擅长长程依赖适合语言建模和趋势预测波形识别里的故障脉冲通常是局部形态特征卷积核的局部感受野更直接训练也快得多。做深度学习matlab项目时我一般先上一维CNN验证数据可用性效果不够再叠加LSTM或注意力层而不是一上来就搭混合结构。2.2 一维CNN的层定义代码与逐层参数说明下面这套层结构可以直接运行输入是128点的单通道信号输出3类故障layers [ sequenceInputLayer(1, Normalization, zscore) convolution1dLayer(16, 16, Padding, same) batchNormalizationLayer reluLayer maxPooling1dLayer(4, Stride, 4) convolution1dLayer(8, 32, Padding, same) batchNormalizationLayer reluLayer maxPooling1dLayer(4, Stride, 4) fullyConnectedLayer(64) reluLayer fullyConnectedLayer(3) softmaxLayer classificationLayer ];逐层说明sequenceInputLayer的第一个参数是每个时间步的特征维数这里原始波形是单通道所以写1Normalization设为zscore让网络训练时自动对输入做标准化代替手工归一化避免信号幅值尺度影响卷积核学习。convolution1dLayer的参数顺序是卷积核长度在前、卷积核数量在后第一层16个核、核长16负责抓局部波形形态第二层核长8、核数32在池化后的特征上组合出更抽象的形态。batchNormalizationLayer放在卷积和激活之间能显著加速收敛也降低对初始学习率的敏感度。maxPooling1dLayer(4,Stride,4)把特征图下采样到四分之一既减少计算量又扩大后续卷积核覆盖的时间范围。最后接两层全连接和softmax输出类别概率。显式写Padding,same是更稳妥的写法特征图的时序长度不会因卷积而缩水池化层的降采样节奏才好推算。省略Padding时不同版本MATLAB行为不一致识别系统设计里不依赖默认值是基本纪律。2.3 一维CNN关键层的参数参照表层对象关键参数作用常见取值sequenceInputLayer特征维数声明输入格式单通道写1多通道写通道数convolution1dLayer核长、核数提取局部波形特征核长取采样点数的1/8到1/16核数从16起翻倍maxPooling1dLayer池化窗、步长降采样扩大感受野窗长2到4步长等于窗长fullyConnectedLayer输出维度组合全局特征64到128最后一层接类别数核长直接影响模型能看到多长的一段波形。假设采样率10kHz、故障特征脉冲持续2到3ms那核长取16到32比较合适核长小于脉冲宽度时卷积核无法完整覆盖一个故障形态第一层就丢失关键信息。核数决定网络容量从16开始训练后看验证集识别率上不去再翻倍小数据集上别一上来就128否则很容易过拟合。还要注意版本兼容。convolution1dLayer是较新版本MATLAB才有的正式层R2023这类版本可以直接使用如果提示找不到该层常见替代是用convolution2dLayer(1,k)把卷积核设成1乘k等效实现一维卷积代价是数据要reshape成1乘N乘1的格式。设计识别系统前先确认Deep Learning Toolbox版本再决定层写法能省掉半天排错时间。提示识别系统里最敏感的参数是卷积核数量不是核长。核长决定看多宽核数决定能学多少种形态后者才真正决定模型容量。3. 喂给一维CNN识别系统的训练数据cell数组构造与增强3.1 sequenceInputLayer的数据格式和常见报错sequenceInputLayer要求每个训练样本是“特征维乘时间步”的矩阵所有样本装在一个列cell数组里。以1000个样本、每个128点为例X randn(1000, 128); % 1000个样本每行一个128点信号 Y categorical(randi(3, 1000, 1), 1:3, {正常, 磨损, 断齿}); trainCell cell(1000, 1); for i 1:1000 trainCell{i} X(i, :); % 1×128即1个特征维×128个时间步 endtrainCell{i}必须是1乘N的数值矩阵行是特征维、列是时间步。这里原始信号是单通道所以行数是1将来接入三向振动这类多通道数据时把三路信号堆成3乘N矩阵放进同一个cell输入层第一参数同步改成3即可。新手最常见的报错是直接把1000乘128的矩阵丢给trainNetwork错误信息会提示期望cell数组。标签用categorical类型第二参数1:3指定原始数值到类别名的映射保证训练和测试两边的标签编码一致。3.2 训练测试划分与分层抽样rng(42); cv cvpartition(Y, HoldOut, 0.2); idxTrain training(cv); idxTest test(cv); trainCell trainCell(idxTrain); trainY Y(idxTrain); testCell trainCell(idxTest); testY Y(idxTest);cvpartition对categorical标签默认按类分层抽样各类在训练集和测试集中的比例与原始数据一致避免某一类样本全部落进测试集。HoldOut 0.2表示留出20%样本做测试。逻辑索引idxTrain在cell数组和categorical向量上都可以直接使用划分后trainCell和testCell保持同一种数据结构trainNetwork和classify阶段不需要额外转换。这里固定rng种子反复跑实验时每次划分都一致结果才能对比。3.3 一维信号的三种增强方法与适用条件小样本是波形识别最常见的问题一维CNN在小数据集上比二维CNN更容易过拟合因为时序样本的多样性本身有限。常见做法是只在训练集上做增强测试集保持原样function xOut addGaussNoise(x, snrDb) % x是1×N信号snrDb是信噪比(dB)值越大噪声越小 pSignal mean(x.^2); pNoise pSignal / (10^(snrDb / 10)); xOut x sqrt(pNoise) * randn(size(x)); end trainCellAug cell(2000, 1); trainYAug repmat(trainY, 2, 1); for i 1:numel(trainCell) trainCellAug{i} trainCell{i}; trainCellAug{i numel(trainCell)} addGaussNoise(trainCell{i}, 20); endaddGaussNoise先按信噪比算出噪声功率再生成同长度高斯白噪声叠加。信噪比20dB是温和增强波形形态基本保留10dB以下会明显改变波形适合强噪声场景但不建议一开始就用。增强把每个样本复制了一份并加噪训练轮数不变时相当于扩大了有效样本量。更稳妥的做法是随机决定每个样本是否增强、用哪个信噪比避免网络对固定噪声模式产生依赖。增强方式实现思路适用场景注意高斯噪声按信噪比叠加白噪声强噪声现场采集数据snr不低于15dB时间平移随机截取或位移对齐触发时刻不固定的波形平移范围小于核长的2倍幅值缩放乘0.9到1.1随机系数传感器灵敏度差异系数区间要小时间平移和幅值缩放都只是对行向量做几行矩阵运算但两种增强都只改训练集测试集必须保持原始采集状态否则评估出来的识别率虚高交付后被现场真实数据打回原形。4. trainNetwork训练一维CNN识别模型的选项设置与评估4.1 trainingOptions关键参数与默认值训练一维CNN和训练图像CNN在MATLAB里的入口完全一致都是trainNetwork差别主要在trainingOptions的参数组合。下面是识别系统里最常用的一套配置options trainingOptions(adam, ... InitialLearnRate, 0.001, ... MiniBatchSize, 64, ... MaxEpochs, 40, ... LearnRateSchedule, piecewise, ... LearnRateDropFactor, 0.3, ... LearnRateDropPeriod, 15, ... ValidationData, {testCell, testY}, ... ValidationFrequency, 20, ... Shuffle, every-epoch, ... Plots, training-progress, ... Verbose, true); net trainNetwork(trainCell, trainY, layers, options);adam求解器对一维CNN识别任务很少需要调动量相关参数先用默认。InitialLearnRate从0.001起步比默认的0.01安全卷积层对学习率比全连接层敏感。MiniBatchSize取64在CPU上内存占用和单轮速度比较均衡信号长度增加到几千点时降到16或32。LearnRateSchedule用piecewise在第15个epoch学习率乘以0.3帮助收敛后期更精细地调整权值。ValidationData用划分好的测试集这里同样要是cell数组格式ValidationFrequency设为20表示每20次迭代计算一次验证损失曲线更平滑设成1的话曲线噪声大而且训练变慢。参数默认值识别系统里常见设定调整依据InitialLearnRate0.010.001训练曲线震荡就下调MiniBatchSize12864或32信号越长取值越小MaxEpochs3040到60数据量小取小值L2Regularization1e-41e-4到1e-3过拟合时调大Shuffleonceevery-epoch小批量训练更稳定4.2 测试集识别率、逐类召回率与混淆矩阵训练完成后评估代码是识别系统设计里必须固化的部分不能只看命令行里最后输出的一个准确率predY classify(net, testCell); acc mean(predY testY); fprintf(测试集准确率: %.2f%%\n, acc * 100); cm confusionmat(testY, predY); recall diag(cm) ./ sum(cm, 2); for i 1:numel(recall) fprintf(类别 %s 召回率: %.2f%%\n, string(testY(i)), recall(i) * 100); end figure; confusionchart(testY, predY);classify输出的是categorical向量和testY逐元素相等等于预测正确的个数mean即准确率。confusionmat得到混淆矩阵diag(cm)除以sum(cm,2)是逐类召回率代表某类真实样本中被模型找回来的比例。confusionchart直接出图横轴是预测类、纵轴是真实类对角线越亮越好。汇报识别系统指标时至少给出总准确率和最小类召回率两个数字后者才是故障样本稀少时模型靠不靠得住的关键。4.3 从训练曲线判断收敛和过拟合窗口training-progress图里有训练损失、验证损失和准确率三条线。判断逻辑不复杂训练损失下降、验证损失同步下降说明学习率合适训练损失继续降、验证损失掉头走高过拟合已经发生通常出现在训练后期对应曲线里验证损失的U型拐点。此时先把MaxEpochs停在前一个位置再从三个方向下手L2Regularization调到1e-3、在池化层后加dropoutLayer(0.2)、减少第二层卷积核数量。反过来如果训练损失和验证损失都降不下去先检查数据trainCell里是否混入全零段、标签顺序是否和样本错位不要一上来就怀疑网络结构。识别系统调参的顺序永远是数据、学习率、容量最后才改网络层数。注意验证集不能反复拿去调参。每次调参都看同一个testCell的结果本质上是在验证集上过拟合。严格做法是再切一份从未参与训练和调参的数据留到最终验收时再使用。5. 一维CNN识别系统交付前的验证顺序与三个易错点5.1 先做时间维度的泛化验证随机划分测的是“模型见过同类数据分布”的成绩现场识别系统真正要回答的是“明天采集的数据还准不准”。常见做法是取同一测点历史数据按时间顺序前80%训练、后20%验证完全不打乱。如果时间切分的识别率和随机切分相差超过5个百分点说明工况随时间漂移这时要让训练集覆盖不同时期的运行数据而不是依赖随机划分的好运气。5.2 模型保存与单样本预测流程save(faultRecogNet.mat, net); netLoaded load(faultRecogNet.mat).net; sig dataAcquireOnce(); % 现场采集一段信号 sig sig(1:128); % 截断并对齐到输入长度 labelNow classify(netLoaded, {sig});save保存训练好的net对象load后可直接classify。单样本预测时注意两点输入仍要包成1乘1的cell数组现场数据必须做和训练集一致的对齐和预处理包括截断位置和触发点任何不一致都会让识别率明显下降。模型文件要和预处理函数打包在一起交接现场工程师拿到的是一整套可复现流程而不是一个孤立的mat文件。5.3 少数类漏报的检查办法正常样本占90%时模型全部判正常也有90%准确率混淆矩阵对角线好看但故障类召回率可能很低。交付前必须逐类看recall对漏报多的类别做两种处理一是用3.3的增强把该类的有效样本量补上来二是在损失层面给少数类加权配合重采样实现。这是很多matlab教程里最容易漏掉的一步识别系统可靠性看的是最差类别不是平均分数。本文还有配套的精品资源点击获取