简介:针对滚动轴承故障特征难以准确表征的问题,提出基于卷积神经网络的故障诊断方法。与奇异值分解、多尺度模糊熵等传统手段相比,该方法从振动信号中自动学习深层特征,提高了状态识别精度。文档对振动信号进行分帧、加窗、离散傅里叶变换及图像编码处理,构建反映轴承故障状态的振谱图,并设计深度卷积神经网络进行特征提取与模式识别,网络采用已知故障样本及对应标签完成训练。全文从原理分析到实验验证完整呈现,使用凯斯西储大学公开轴承数据测试,识别准确率达到百分之百,验证了该方法在机械设备状态监测中的有效性,能够帮助读者系统掌握振动信号预处理、网络建模与实验验证的完整流程。资源仅包含一份PDF格式文档,容量约为一点二八兆字节,适合机械工程、智能制造及人工智能交叉领域的研究生、科研人员和工程技术人员阅读,可用于故障诊断课题研究、论文写作或课程设计参考。该资源已有571人学习下载。
1. 基于卷积神经网络的滚动轴承故障诊断:从信号到决策的完整链路
滚动轴承故障诊断的本质,是一个从振动信号中提取退化特征并完成模式识别的过程。传统方法依赖人工设计特征:时域的峰值因子、峭度,频域的边带能量,或是小波包分解后的频带熵——这些特征在恒定转速、单一工况下表现尚可,一旦负载波动或转速变化,特征分布发生偏移,分类器精度便急剧下滑。卷积神经网络打破了这个瓶颈,它绕开人工特征工程,直接在原始信号或其变换域上学习判别性表示。但很多人忽略了一个关键事实:CNN在轴承诊断上的表现上限,不取决于网络深度,而取决于输入构造方式——把1D振动信号不做处理直接送入Conv1D,与先转换为时频图再送入Conv2D,两者精度可能相差10个百分点以上。这篇文章要讲的,就是一条完整可复现的落地路径:输入如何构造、网络如何设计、参数如何设置、以及最关键的一步——如何确认网络学到了真正的故障特征而不是噪声。
2. 为什么是卷积神经网络:局部连接、权值共享与故障特征的天然契合
滚动轴承的故障信号有一个显著特点:故障特征在频域上是局部化的。外圈故障的特征频率约为转频的3.05倍,内圈故障约为4.95倍,滚动体故障则与保持架转速相关。这些特征频率以窄带能量形式集中在特定频段,在时频图上表现为周期性出现的水平亮带。CNN的两个核心机制——局部连接和权值共享——恰好与这种信号的局部性相匹配。
2.1 局部连接:匹配故障冲击的短时相关性
振动信号中,一次故障冲击持续时间极短,通常只有零点几毫秒到几毫秒。在40kHz采样率下,一次冲击仅覆盖20~80个采样点。全连接网络把整段信号的所有采样点都纳入计算,冲击特征被淹没在大量无关信息中。而卷积层只让每个神经元连接输入的一个局部区域——这个区域的大小由卷积核尺寸决定。当卷积核尺寸为64时,它只关注64个连续采样点内的模式,恰好覆盖一次故障冲击的时长。这种结构让网络天生适合捕捉短时冲击模式,而不必学习如何从全局信号中手动筛选。
2.2 权值共享:对故障相位的平移不变性
轴承故障的另一个特点是相位不确定性。同一型号轴承、同一故障类型,故障点出现在圆周上的哪个位置是随机的,这意味着故障冲击相对转频的相位不是固定的。全连接网络会把不同相位的同一故障当成不同类别,需要大量样本才能学会“相位无关”的判断。卷积层通过权值共享天然解决了这个问题:同一个卷积核在信号的不同位置滑动,无论故障冲击出现在哪个时间点,卷积核提取的特征是相同的。这给了CNN一个结构性的先验——故障特征应当是不依赖于位置的。
2.3 层次化特征:从冲击脉冲到故障类型的抽象链条
CNN的层级结构对应着特征抽象的不同粒度。浅层卷积核学到的是短时的边缘、脉冲形状;中层卷积核把相邻冲击组合成周期性模式;深层卷积核则综合多个通道的信息,判别这是内圈故障还是外圈故障。这种层次化结构与故障诊断的推理逻辑高度一致——先检测冲击,再确认周期性,最后判断故障位置。相比之下,手工特征工程把这个链条强制压缩成单个标量特征,丢失了中间层的丰富信息。
2.3.1 LeNet-5 结构对轴承诊断的启发
热词里的 LeNet-5 虽是为手写数字识别设计的,但它的结构范式——卷积-池化-全连接——可以直接迁移到轴承诊断。LeNet-5 用 5×5 卷积核提取局部模式,2×2 最大池化做降采样;在轴承诊断中,这个范式对应的是:卷积核捕捉短时冲击波形,最大池化选择响应最强的冲击位置,全连接层完成故障类型映射。实际设计网络时不必照搬 LeNet-5 的层数,但“卷积层逐层缩小空间尺寸、通道数逐层增加”的缩放规律是通用的。
3. 输入构造:决定诊断精度上限的预处理环节
在CNN轴承诊断中,预处理不是可选项,而是精度差异的主要来源。同一个网络结构,输入从原始波形换成频谱图,测试精度可能从85%跳到97%。这一章讲清楚三种输入构造方式的原理、实现和适用场景。
3.1 原始1D波形:最直接但最难学
直接把振动信号截断成固定长度送入Conv1D网络,是最简单的做法。常见做法是取1024或2048个采样点作为一个样本,对应40kHz采样率下的25.6ms到51.2ms信号。这个方案的优点是信息无损——所有原始信息都在;缺点是网络必须自己学会从时域波形中分离故障冲击和噪声,需要大量样本才能收敛。
一个实用的改进是重叠采样。取采样步长为512、窗口长度为2048时,相邻样本有75%的重叠,一个1秒钟的样本段可以切出约60个训练样本,相当于做了数据增强。这种做法在样本量不足时极为有效。
3.2 频域特征图:把故障特征从周期中解放出来
原始波形的问题在于故障特征分散在整个时间轴上,网络需要跨越大范围才能建立联系。快速傅里叶变换把周期信号能量集中在少数几个频点,大幅降低了学习难度。实际操作时,对1024个采样点做FFT得到512个频点,取幅值谱作为输入向量,再reshape为二维张量送入Conv2D网络。
FFT输入的一个衍生方案是对数幅值谱——取log(1 + amplitude),避免大能量频段主导梯度。这种方法在恒定转速场景下效果极好,因为故障特征频率是确定的,FFT能把它精确映射到固定频点上。
3.3 时频图:应对变转速工况的最稳选择
大多数实际工况下转速并不恒定。转速变化导致故障特征频率等比漂移,FFT谱上的峰值位置不再固定,网络见过的故障频点就对不上了。短时傅里叶变换(STFT)同时保留时间和频率两个维度,对转速波动有更强的容忍度。
import numpy as np from scipy.signal import stft # 参数设置 fs = 25600 # 采样率 25.6 kHz window = 'hann' # 汉宁窗,主瓣窄、旁瓣衰减快,适合机械信号 nperseg = 256 # 每段FFT点数,对应10ms时间分辨率 noverlap = 200 # 78%重叠率,增加帧间连续性 sample_rate, spec = stft(signal, fs=fs, window=window, nperseg=nperseg, noverlap=noverlap) # spec 的维度是 (129, T),129 个频率点,T 个时间帧 # 转成CNN输入格式:单通道灰度图 spec_db = 20 * np.log10(np.abs(spec) + 1e-8) # 转dB刻度,压缩动态范围 spec_db = (spec_db - spec_db.mean()) / spec_db.std() # 标准化 input_tensor = spec_db.reshape(1, 129, T, 1) # (batch=1, height, width, channel)代码的逻辑是:STFT把一段振动信号切成多个短帧,每帧做FFT,得到一个时间和频率的二维矩阵。dB刻度的转换模仿人耳对声音强度的感知——机械故障的早期冲击能量较弱,线性刻度下难以与人声、环境噪声区分,dB刻度把微弱的边带结构放大到可见范围。标准化则确保不同轴承样本的幅值尺度一致,避免大振幅样本主导梯度。
参数设置上,nperseg=256对应约10ms的时间分辨率,对转速在3000rpm以下(转频50Hz)的轴承而言,每个转频周期内约有19个时间帧,足以分辨故障冲击的周期性。noverlap=200(78%重叠)是经验值——重叠太小时相邻帧差异过大,时频图在时间方向不连续;重叠太大则计算量增加但对精度提升有限。
如果去掉dB转换直接使用线性幅值,少数强频点的能量会压制故障边带,这个问题在实测数据中很常见。另一个常见错误是把时频图直接resize成224×224塞给ImageNet预训练网络——STFT的物理分辨率会被resize打乱,建议保持原始STFT尺寸或仅做整数倍缩放。
3.3.1 时频图输入的小技巧:合并多通道
单通道时频图只用了一个传感器的数据。如果同一轴承同时采集了水平和垂直两个方向的振动信号,可以分别做STFT,然后作为两个通道合并成2通道输入。这比把两个信号拼接成一维向量再送入网络效果更好——卷积核能同时学习两个方向的联合特征,比如水平方向出现冲击、垂直方向同时出现系统共振的耦合模式。加速度计测振动时,这个做法基本不增加成本。
4. 搭建CNN模型:网络结构、训练参数与收敛策略
输入构造完成之后,网络设计成为决定精度上限的第二道关口。这里给出一个经过实测考验的模型结构,以及每一层的设计理由。
4.1 一个针对时频图输入的网络结构设计
以129×128的STFT时频图为例,网络结构设计遵循“空间尺寸逐层减半、通道数逐层翻倍”的原则:
import tensorflow as tf from tensorflow.keras import layers, Model def build_cnn(input_shape=(129, 128, 1), num_classes=4): inputs = tf.keras.Input(shape=input_shape) # Block 1: 捕获射频方向的局部纹理模式 x = layers.Conv2D(16, (3, 3), padding='same', activation='relu')(inputs) x = layers.BatchNormalization()(x) x = layers.MaxPooling2D(pool_size=(2, 2))(x) # 129×128 -> 65×64 # Block 2: 扩大感受野,组合局部纹理为周期性模式 x = layers.Conv2D(32, (3, 3), padding='same', activation='relu')(x) x = layers.BatchNormalization()(x) x = layers.MaxPooling2D(pool_size=(2, 2))(x) # 65×64 -> 33×32 # Block 3: 捕捉跨频率-时间的全局联合特征 x = layers.Conv2D(64, (3, 3), padding='same', activation='relu')(x) x = layers.BatchNormalization()(x) x = layers.MaxPooling2D(pool_size=(2, 2))(x) # 33×32 -> 17×16 x = layers.Flatten()(x) x = layers.Dense(128, activation='relu')(x) x = layers.Dropout(0.5)(x) outputs = layers.Dense(num_classes, activation='softmax')(x) model = Model(inputs, outputs) return model model = build_cnn() model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.summary()几个需要特别说明的设计决策:
第一,激活函数选用ReLU而非sigmoid。ReLU解决梯度消失问题,让深层网络可以训练;同时ReLU的稀疏激活性让模型倾向于用少量神经元表达强特征,这与振动信号“少数频段承载故障信息”的特性一致。第二,每个卷积块后接BatchNormalization而不是直接接池化。BN层在小batch训练时能稳定分布偏移,轴承数据集往往只有几千个样本,分布的稳定性对收敛影响很大。第三,池化选择最大池化而不是平均池化。最大池化取邻域内的最大响应值,相当于“只保留最强烈的冲击响应,丢弃弱响应”——这对冲击型故障特征是最恰当的降采样策略。第四,Dropout放在全连接层前且rate设为0.5。全连接层的参数量占总参数量的大部分(128×17×16×64≈220万),是过拟合的主要来源,这里用较高的丢弃率做正则。
4.2 训练的关键参数:batch size、学习率与早停
模型结构定了之后,训练参数的设置直接决定最终精度。轴承故障数据集通常是几十秒到几分钟的振动信号切成的几千个样本,规模远小于ImageNet,因此需要特殊策略避免过拟合。
| 参数 | 推荐值 | 设置理由 |
|---|---|---|
| batch size | 32 | 样本量小,大batch(128+)会导致梯度方向过于确定,模型容易过拟合训练集;32提供一个适中的梯度噪声,有正则化效果 |
| 初始学习率 | 1e-3 | 过高的学习率在训练初期让loss震荡,过低的收敛过慢;Adam优化器自带适应性学习率,1e-3是常用安全起点 |
| 学习率衰减 | 每20个epoch×0.5 | 训练后期大学习率会在最优解附近震荡,指数衰减让收敛更平滑 |
| 早停 patience | 15个epoch | 验证集精度连续15个epoch不提升即停止训练,节省时间并防止过拟合 |
| Dropout rate | 0.5 | 全连接层的强正则化,测试时网络等效于多个子网络的集成 |
使用早停还有一个额外的收益:它自动决定训练轮数,避免人为设定 epoch 次数导致欠拟合或过拟合。监控指标建议选用验证集loss而不是验证集accuracy——accuracy在类别不平衡时会掩盖过拟合信号。
4.3 训练过程中的常见陷阱
轴承诊断训练中最容易出现的一个问题是“验证集精度很高,但测试集精度断崖式下跌”。这通常不是网络结构问题,而是样本切分方式造成的泄漏。相邻的振动样本段有大量重叠(重叠采样率75%以上),如果随机划分训练集和测试集,来自同一连续信号段的样本会同时出现在两边,模型看到的“测试数据”其实是训练数据的近复制品。正确的做法是按时间顺序划分——前70%时间段的样本做训练,后30%时间段的样本做测试,或者按不同工况/不同负载的数据做划分。
另一个容易忽略的问题是不平衡采样。当采样率为25.6kHz、每类故障采集10秒数据时,样本总数约在2000~8000之间;但正常样本往往远多于故障样本,因为设备大多数时间处于健康状态。处理不平衡的常见做法是:对故障类别的样本做重叠采样(增大切分步长、增加样本数),对正常类别做随机降采样,让各类别样本数接近。
5. 故障特征可视化:判断网络是否学到真实故障特征的关键验证
模型训练完成后,准确率98%并不能说明问题的能力边界。一个常见的糟糕情况是:模型在实验室数据上表现完美,部署到现场后崩溃——因为网络学到的是实验台的固有频率共振,而不是故障本身的特征。特征可视化是识别这个问题的核心手段。
5.1 卷积核响应可视化:浅层到底看到了什么
取训练好的模型第一层卷积核,将时频图输入网络,可视化每个卷积核的输出激活图。频率方向上,如果某个卷积核的输出集中在一个窄频带——比如2000~2500Hz区间——说明它学到的是频带滤波器;如果激活分散在整个时频图上,说明该卷积核只是等效于一个全通滤波器,没有学到有区分度的特征。
import matplotlib.pyplot as plt # 提取第一个卷积层的输出 layer_name = 'conv2d' intermediate_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output) # 取一个测试样本的激活 activation = intermediate_model.predict(sample_tensor) # (1, H, W, 16) fig, axes = plt.subplots(4, 4, figsize=(12, 12)) for i in range(16): row, col = divmod(i, 4) axes[row][col].imshow(activation[0, :, :, i].squeeze(), cmap='viridis', aspect='auto') axes[row][col].set_title(f'Kernel {i}') plt.tight_layout() plt.show()对16个卷积核的激活图逐一观察,能直接确认网络是否学习到与故障冲击对应的频带特征。如果一个卷积核的输出在时频图某个横向位置持续高亮,表明它捕捉到了该时间点出现的多次冲击——这种模式与轴承故障的周期性冲击特征吻合。
5.2 类别激活图:定位决策依据的物理含义
梯度加权类激活映射(Grad-CAM)能标出输入时频图的哪些区域主导了分类决策,把“网络关注什么”从黑盒变成可视化判断。
def grad_cam(model, sample_tensor, target_class): # 找到最后一个卷积层 last_conv = [l for l in model.layers if 'conv2d' in l.name][-1] grad_model = Model(inputs=model.input, outputs=[last_conv.output, model.output]) with tf.GradientTape() as tape: conv_output, predictions = grad_model(sample_tensor) loss = predictions[:, target_class] grads = tape.gradient(loss, conv_output) pooled_grads = tf.reduce_mean(grads, axis=(1, 2)) # 加权求和得到热力图 conv_output = conv_output[0] pooled_grads = pooled_grads[0] for i in range(conv_output.shape[-1]): conv_output[:, :, i] *= pooled_grads[i] heatmap = tf.reduce_mean(conv_output, axis=-1).numpy() heatmap = np.maximum(heatmap, 0) heatmap = (heatmap - heatmap.min()) / (heatmap.max() - heatmap.min()) return heatmapGrad-CAM 的逻辑链是:取最后一个卷积层的输出,计算损失对每个特征图通道的梯度,梯度大小表示这个通道对分类目标的贡献程度;用梯度对特征图做加权求和,得到空间上的重要性分布。代码中pooled_grads返回每个通道的单一权重——梯度在所有空间位置上的均值;然后将该权重乘回特征图的每个通道,再跨通道求和得到最终的2D热力图。
通过叠加热力图与原始时频图,可以看到一个关键判断:热力高的区域是否恰好位于理论特征频率对应的频带上。如果热力集中在特征频率±某个带宽范围内,说明网络学到了物理解释清晰的故障特征;如果热力全部集中在时频图的低频边缘区域,则模型可能在利用转频的倍频信息做判断——这在恒定转速下有效,但转速变化后就会失效。
5.3 误分类样本分析:边界在哪里
对测试集里预测错误的样本做一个系统性分析,是确定模型适用边界的直接方法。做法是对每个错误分类的样本,打印真实标签、预测概率分布(softmax输出向量)和对应的时频图。观察预测概率分布是集中在一个错误类别上还是平摊在多个类别上:前者说明该故障类型的特征模式过于相似(比如内圈故障与外圈故障在轻负载下边带结构相近),后者说明输入信号本身信息不足(噪声过大或采样段过短)。
这种分析可以直接指导下一步的方向:如果误分类集中在某一对类别之间,考虑在STFT中提高频率分辨率(增大nperseg);如果是噪声主导,考虑在STFT之前增加带通滤波;如果特定转速下误分类率飙升,则需要补充该转速的训练数据、或者改用同步平均等转速归一化技术。特征可视化不是研究者的自娱自乐,而是决定模型能否从实验室走向现场的关键一步。
本文还有配套的精品资源,点击获取