
简介基于TCN时间卷积神经网络的故障诊断Matlab实现面向计算机、电子信息工程、数学等专业学生及故障诊断入门研究者可用于课程设计、期末大作业与毕业设计。压缩包共8个文件包含可直接运行的.m源程序、配套案例数据.xlsx、结果示意图.png以及整合版.zip整体仅350KB结构清晰、便于对照学习。代码采用参数化编程参数可灵活调整注释详细、思路明确并兼容Matlab2014/2019a/2024a替换数据即可迁移应用。已有271人学习下载。借助该资源可快速掌握TCN在时间序列分类故障诊断中的搭建流程省去数据准备与调参摸索时间适合希望低成本入门深度学习故障诊断的初学者。1. 基于TCN时间卷积网络的故障诊断为什么值得做设备振动信号里藏着轴承、齿轮和转子的大部分早期失效特征但人工设计特征既费时间又很难覆盖变工况下的信息漂移。时间卷积网络Temporal Convolutional NetworkTCN用因果卷积加膨胀率把序列建模成一种可并行计算的单向时间模型在长时间依赖和训练速度上往往优于同规模循环网络因此这几年被大量用在故障诊断代码里。基于MATLAB实现TCN最大的好处是不用手写反向传播直接借用Deep Learning Toolbox里的网络层和训练选项就能把模型跑起来这对习惯Simulink和信号处理工具箱的工程师尤其友好。本文面向正在做轴承故障诊断或设备状态识别的工程人员讲清楚TCN的模型结构、MATLAB实现步骤、关键参数和调参方法。2. TCN模型结构、因果卷积与故障诊断分类建模2.1 把故障诊断转化成时序分类问题故障诊断的核心是从一段振动位移或加速度信号中判断故障类型比如正常、内圈故障、外圈故障、滚动体故障。如果把这N个采样点看作一个时间序列分类器就要从序列整体中提取能够区分类别的特征。TCN本质上是一个对时间步进行卷积的编码器它不像LSTM那样按时间步循环展开而是对整段序列同时做卷积因此训练时更容易利用GPU并行计算。典型做法是输入形状为1×L的窗口其中L是窗口长度输出是K类故障的概率分布。网络内部不会像普通卷积分类任务那样直接使用二维卷积而是使用一维因果卷积Causal Convolution保证输出在时间t只依赖输入在t及之前的信息。加上膨胀率Dilation Factor后每一层能看到的感受野按指数增大覆盖更长的历史范围。残差连接负责解决层数加深时的梯度衰减使得TCN可以堆叠到10层以上而不会训练不稳定。MATLAB的Deep Learning Toolbox从R2019a开始提供convolution1dLayer并且支持Padding,causal这让TCN的因果卷积可以直接声明而不需要手动裁剪序列末端。下面用层图构建一个不含残差的入门版TCN便于先理解核心结构带残差的完整版在4.1节中说明。2.2 用MATLAB层图搭建TCN网络下面的代码创建一个3层膨胀卷积的TCN分类网络输入是单通道振动信号输出是故障类别。numClasses 4; % 故障种类数 numFilters 32; % 卷积核个数 kernelSize 3; % 卷积核长度 lgraph layerGraph(); layers [ sequenceInputLayer(1, Name, input) % 单通道序列输入 convolution1dLayer(kernelSize, numFilters, ... Padding, causal, DilationFactor, 1, Name, conv1) batchNormalizationLayer(Name, bn1) reluLayer(Name, relu1) convolution1dLayer(kernelSize, numFilters, ... Padding, causal, DilationFactor, 2, Name, conv2) batchNormalizationLayer(Name, bn2) reluLayer(Name, relu2) convolution1dLayer(kernelSize, numFilters, ... Padding, causal, DilationFactor, 4, Name, conv3) batchNormalizationLayer(Name, bn3) reluLayer(Name, relu3) globalAveragePooling1dLayer(Name, globalAvgPool) % 变成只有一个特征向量 fullyConnectedLayer(numClasses, Name, fc) softmaxLayer(Name, softmax) classificationLayer(Name, classification) ]; lgraph addLayers(lgraph, layers); analyzeNetwork(lgraph);代码逻辑说明输入层定义了1个通道即振动信号的瞬时幅值。convolution1dLayer的Padding设置为causal保证卷积是因果的DilationFactor分别为1、2、4让后一层的输出对应到更早的时间点。每个卷积后接批归一化和ReLU中间加了globalAveragePooling1dLayer把每一根卷积核在时间维度上做全局平均最终得到一个长度为numFilters的特征向量。池化层去掉时间步后fullyConnectedLayer才能正常输出分类结果避免全连接层对每个时间步都做运算而浪费参数。参数说明kernelSize3是小卷积核标配适合振动信号的局部瞬态特征numFilters32在样本量不大时足够如果训练集超过数万窗口可以翻倍到64或128。DilationFactor按2的幂增长3层时感受野约为1 (3-1)*(124)15个采样点对于采样率20kHz的轴承信号这个长度只能捕捉高频冲击。目标故障特征在500Hz附近时需要增加层数或加大膨胀率具体见4.2节。2.3 残差连接如何补全TCN上面的网络没有残差连接严格来说只能算“膨胀因果卷积网络”不是完整TCN。TCN的每个残差块通常包括两层膨胀卷积、一层Dropout以及将输入直接加到输出上的恒等映射。当输入通道数和卷积输出通道数不同时残差路径用1×1卷积对齐通道数。MATLAB中可以通过additionLayer把残差路径和卷积输出相加。下面是一个残差块的关键结构示意。% 主路径 conv1 convolution1dLayer(kernelSize, numFilters, ... Padding, causal, DilationFactor, dilation, Name, blockConv1); conv2 convolution1dLayer(kernelSize, numFilters, ... Padding, causal, DilationFactor, dilation, Name, blockConv2); mainPath [conv1; batchNormalizationLayer(Name,bn) ; reluLayer(Name,relu); ... conv2; batchNormalizationLayer(Name,bn2)]; % 残差路径 resPath convolution1dLayer(1, numFilters, Padding, same, Name, residual); % 在层图中使用 addLayers 和 connectLayers 将主路径、残差路径连接到 additionLayer addLayer additionLayer(2, Name, addBlock);加入残差后网络可以加深到堆叠810个残差块而不出现梯度消失。实际做故障诊断时先用23个残差块起步验证集准确率上不去再逐步加深这比一上来就堆大量层更有效。对于噪声较强的振动信号残差块中的Dropout一般设置为0.20.5避免模型记住尖峰噪声。3. 用MATLAB读取振动数据、训练模型并验证故障诊断结果3.1 从原始信号构造滑动窗口样本大部分故障数据集以连续波形文件或Excel表格形式保存训练时不能直接把整个长信号送入网络而是需要切分为短窗口。窗口长度一般取故障特征频率对应周期的23倍例如转速1500rpm时转频是25Hz一个周期为0.04s在20kHz采样率下对应800个采样点窗口取2048点足够。下面的函数从一个长信号和采样点标签中生成训练样本关键参数是窗口长度和滑动步长。function [X, Y] makeSlidingWindows(signal, labels, winLen, step) % signal: 1×N 双精度振动信号 % labels: 1×N 整数标签与signal长度一致 % winLen: 窗口长度 % step: 滑动步长step winLen 时会有重叠 n length(signal); startIdx 1:step:(n - winLen 1); numWin length(startIdx); X cell(1, numWin); Y categorical(zeros(1, numWin)); % 预先分配Categorical数组 for i 1:numWin s startIdx(i); window signal(s:swinLen-1); X{i} window; % 1×winLen 行向量需要时包含多通道 midIdx s floor(winLen/2); % 用窗口中心点的标签代表整段窗口 Y(i) categorical(labels(midIdx)); end end逻辑说明X被设计成一个1×numWin的cell数组每个元素是1×winLen的向量这是trainNetwork处理序列输入的默认格式。若信号是多通道比如同时采集加速度和速度每个X{i}应该改成channels×winLen矩阵。Y用窗口中心点标签的目的是避免窗口跨越两类故障的切换边界时产生错误的样本标签。参数说明滑动步长step影响样本数量和相关性。stepwinLen时窗口完全无重叠样本少但独立stepfloor(winLen/2)时重叠50%样本量约增加一倍训练集扩大但相邻样本高度相似容易让验证集指标偏乐观。建议先从stepwinLen开始跑通流程再调整到重叠50%进行效果对比。3.2 训练选项和训练流程网络和数据准备好之后设置训练选项并调用trainNetwork即可。这里以4分类故障诊断为例。% XTrain, YTrain, XVal, YVal 由 makeSlidingWindows 生成 options trainingOptions(adam, ... InitialLearnRate, 1e-3, ... MaxEpochs, 50, ... MiniBatchSize, 32, ... ValidationData, {XVal, YVal}, ... ValidationFrequency, 20, ... Shuffle, every-epoch, ... Plots, training-progress, ... Verbose, true); net trainNetwork(XTrain, YTrain, lgraph, options); % 测试集分类 YPred classify(net, XTest); YTest categorical(YTest); testAcc mean(YPred YTest); fprintf(测试准确率: %.2f%%\n, testAcc * 100);训练选项说明adam是处理序列卷积的常见选择收敛速度比sgdm平滑。InitialLearnRate1e-3对多数TCN网络是安全起点如果训练损失持续震荡降到3e-4如果2个epoch内损失下降很慢则可以升到2e-3。ValidationFrequency设置为20表示每20次迭代在验证集上计算一次准确率这个间隔要小于总的迭代步数否则看不到验证曲线。MiniBatchSize受显存限制输入序列长度为2048时32是个平衡值。训练完成后用classify得到预测标签。测试准确率只适合快速判断流程是否通畅样本重叠时不能作为最终结论还需要用下一章的混淆矩阵和F1分数做可靠评估。3.3 一个常见的数据坑样本混叠如果滑动窗口重叠率过高同一个原始样本的许多近邻片段会同时出现在训练集和测试集导致验证准确率虚高。解决方法是按“信号段”划分数据而不是按“窗口”划分。在采集时记录每次变换工况或故障件对应的信号段编号划分训练/测试集时保证同一个编号下的窗口不会跨集合。整理数据时应当同时返回窗口对应的段编号例如在makeSlidingWindows中额外增加一个输出SegID用于划分。4. TCN关键参数调整、感受野计算与验证指标4.1 残差块数量、膨胀率与感受野的关系TCN的“时间记忆长度”由感受野决定。感受野覆盖的采样点越多能看到的波形周期越长但网络参数量和层数也会上升。感受野可通过下面公式估算RF 1 (kernelSize - 1) * sum(2^(0 : numBlocks-1))如果使用4个残差块膨胀率依次为1、2、4、8卷积核长度3那么感受野为1 2*(1248)31个采样点。对10kHz采样下频率为100Hz的特征信号一个周期是100个采样点31点感受野不足需要把残差块加到6个得到1 2*(12481632)127点。在MATLAB中增加残差块只需修改createTCN函数的numBlocks参数但训练时间会线性上升。下表整理了几个关键参数在不同取值下的影响和推荐方向。参数取值范围对故障诊断的影响推荐做法numFilters16128控制特征宽度太窄欠拟合太宽过拟合样本1万用1632样本5万用64128kernelSize37大卷积核感受野更大但参数更多保持3需要更大感受野时优先加深层数numBlocks28决定感受野覆盖范围先3块起步用4.2节方式验证感受野dropout0.10.5抑制过拟合噪声大时适当提高初始0.2训练集准确率明显高于验证集时调高InitialLearnRate1e-42e-3学习率过大会震荡过小收敛慢先用1e-3观察前5轮损失曲线当numBlocks增加时网络初始化参数增多建议配合clipGradients防止梯度爆炸options trainingOptions(adam, ... InitialLearnRate, 1e-3, ... GradientThreshold, 1, ... MaxEpochs, 60, ... MiniBatchSize, 32, ... ValidationData, {XVal,YVal}, ... Plots, training-progress);梯度裁剪参数说明GradientThreshold1指的是梯度的L2范数超过1时进行缩放。TCN的膨胀卷积会放大梯度传播路径当训练损失突然出现NaN或剧烈抖动时优先检查这个参数而不是盲目降低学习率。4.2 验证感受野是否覆盖特征周期只算公式不够直观实际工程里可以在训练前用一个已知脉冲信号测试网络观察网络最后一个卷积层对脉冲的响应。准备一个长度1024的脉冲信号位置在时间步512处经过TCN后查看globalAveragePooling1dLayer之前的输出特征图是否发生了响应。impulse zeros(1, 1024); impulse(512) 1; XTest {impulse}; dlnet dlnetwork(lgraph); dly predict(dlnet, XTest, Outputs, relu3); plot(extractdata(dly{1}));如果输出特征中只有末尾附近出现响应说明感受野没有覆盖脉冲位置需要增加残差块数量或膨胀率。这种验证方法在调试网络结构时非常管用能直接看出时间记忆范围。4.3 使用混淆矩阵、F1分数而非单一准确率故障诊断中类别往往不均衡比如“正常”样本远多于各故障样本准确率会被多数类拉高。分类完成后至少要看F1分数。代码如下cm confusionmat(YTest, YPred); precision diag(cm) ./ sum(cm, 1); recall diag(cm) ./ sum(cm, 2); F1 2 * precision .* recall ./ (precision recall); % 显示正常、内圈故障、外圈故障、滚动体故障各自的F1 fprintf(各类F1: %.3f %.3f %.3f %.3f\n, F1); confusionchart(YTest, YPred);指标计算说明precision表示预测为该类别的样本中有多少是真正该类recall表示该类真实样本中有多少被正确找出。当某类样本特别少时可能出现recall0对应F1为0这时需要检查模型是否把该故障全部错分到相邻类别而不是只提升训练集数量。5. 进阶技巧用analyzeNetwork检查结构无效和用GPU加速训练训练TCN之前先执行analyzeNetwork(lgraph)它能够提前发现层连接维度不匹配、无效的Padding选项等问题。如果additionLayer的输入维度不一致错误会直接提示具体层名比训练到一半报错更容易定位。特别是在修改残差块后通道数或时序长度不匹配时analyzeNetwork会立即给出红色错误标记。另一个实用技巧是利用MATLAB的parallel.gpu.available确认GPU设备是否可用。在trainingOptions中加入ExecutionEnvironment,gpu并确保输入数据是CPU端常规矩阵训练时会自动放到GPU。需要注意的是TCN批量训练时如果每个样本长度不同trainNetwork会自动补零到mini-batch内最长长度这会造成填充位置被卷积计算从而影响梯度。解决方法是尽量把窗口长度统一或者在预处理时截断到固定长度。我们前面用固定窗口切分已经规避了这个问题。对于显存不足的情况可以降低MiniBatchSize但保持总epoch数不变。显存占用与miniBatchSize × winLen × numFilters × numBlocks大致成正比在32GB内存的开发机上序列长度4096、numFilters64时batchSize16是安全的起点。若显存仍在8GB以下适当减少numFilters比减少batchSize对模型性能更有利因为滤波器数量直接决定特征表示能力。最后建议在训练结束后保存网络和训练选项方便后续对比调参结果。使用save(tcn_fault_model.mat, net, options)即可下次加载时直接调用classify完成实时诊断。至此一个基于TCN时间卷积网络的故障诊断MATLAB实现从网络构建、数据切分、训练验证到调参排错已经全部跑通。如果在自己的数据集上发现训练准确率上不去优先检查感受野覆盖范围和数据划分方式然后按照4.1节的表格逐项调整参数。本文还有配套的精品资源点击获取