news 2026/10/19 5:18:18

基于深度学习的滚动轴承故障诊断毕设实战:CWRU数据预处理与CNN/DNN模型全链路解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习的滚动轴承故障诊断毕设实战:CWRU数据预处理与CNN/DNN模型全链路解析

简介:这份资源是面向高校学生与深度学习入门者的滚动轴承故障诊断毕业设计完整项目包,围绕振动信号采集、预处理、模型构建、训练调优、故障诊断预测及结果可视化六个环节展开,适合作为课程设计、毕业设计或故障诊断方向入门实践的参考方案。压缩包共41个文件,约34.88MB,以30个mat数据文件为核心,配套4个py源码脚本、6个md说明文档和1个txt使用说明,涵盖数据生成、预处理、CNN与DNN模型实现及散点图绘制等模块,目录结构清晰,便于按流程复现实验。目前已有241人学习下载。读者可据此获得一套可直接运行的深度学习故障诊断代码与完整CWRU轴承数据集,理解从原始振动信号到故障类型输出的全流程实现思路,并借助说明文档快速完成环境配置与结果验证,为后续模型改进和论文撰写提供扎实基础。

1. 从一份“跑不通”的轴承故障诊断毕设说起

很多同学做“python毕业设计-基于深度学习的滚动轴承故障诊断方法”时,卡住的地方往往不是 CNN 或 LSTM 本身,而是数据怎么读、标签怎么对、模型输出怎么解释。这份资源把 CWRU 数据集、creat_data.py、pre_data、cnn.py、dnn.py、plot_scatter.py和last_layer_data一起打包,等于把“数据准备—预处理—建模—训练—可视化”整条链路摊开给你看。它适合正在做深度学习方向毕设、课设,或者需要一份可复现故障诊断方案的人。下面按需求、设计、实现、避坑、验收的顺序,把这份方案拆成能直接参考的结构。

2. 需求与数据基础:CWRU 振动信号怎么变成可训练样本

2.1 故障诊断任务到底在诊断什么

滚动轴承故障诊断的本质,是从振动信号里判断轴承当前处于哪种状态。常见状态包括正常、内圈故障、外圈故障、滚动体故障,每种故障还可能对应不同损伤直径。CWRU 数据集把这些状态按采样频率、负载、转速分文件存放,所以第一步不是急着搭网络,而是先明确标签体系:你要做几分类,每类对应哪些文件,样本长度取多少。

我一般会先把任务定义写清楚:输入是一段定长振动信号,输出是类别编号。比如 1750、1730、1772 这些数字,通常对应不同采样点或文件编号,具体含义要看README.md和使用说明.txt。如果标签和文件对不上,后面准确率再高也没有意义。这一步的交付物是一张“文件—状态—标签”映射表,而不是直接开跑cnn.py。

2.2 数据预处理链路:去噪、切片、归一化

原始振动信号不能直接喂给网络。通常的做法是:先按固定窗口切片,比如每 1024 或 2048 个点作为一个样本;再做归一化,把幅值缩放到 0 到 1 或标准化到均值为 0、方差为 1;如果信号噪声大,还会加一层简单滤波或滑动平均。pre_data目录和creat_data.py就是干这件事的。

下面这段代码展示了一个典型的切片与归一化流程,你可以按自己数据调整窗口长度和步长:

import numpy as np def make_samples(signal, label, window=1024, step=512): """ signal: 一维振动信号 label: 该信号对应的类别编号 window: 每个样本的长度 step: 滑动步长,步长小于窗口可做数据增强 """ samples = [] labels = [] for start in range(0, len(signal) - window + 1, step): seg = signal[start:start + window] # 归一化到 [0,1],避免幅值差异影响训练 seg = (seg - seg.min()) / (seg.max() - seg.min() + 1e-8) samples.append(seg) labels.append(label) return np.array(samples), np.array(labels)

这段逻辑的关键参数是window和step。窗口太短,故障特征看不出来;窗口太长,样本数不够,训练容易过拟合。步长小于窗口时,样本之间有重叠,相当于做了数据增强,但要注意训练集和测试集必须按原始文件划分,不能把同一段信号的切片同时放进两边,否则准确率会虚高。creat_data.py里通常还会把生成好的样本保存成.npy或.csv,方便后面直接加载。

2.3 标签编码与数据集划分

标签要用整数编码,比如 0 到 9 对应十种状态。划分数据集时,我习惯按“文件级”划分:某些文件做训练,另一些文件做测试,而不是随机打乱所有样本。这样更接近真实场景,也能避免同源数据泄漏。如果要做交叉验证,可以按负载或转速分组,比如用 0 负载训练、1 负载测试,看模型跨工况的泛化能力。这一步做完,你手里应该有三个数组:X_train、y_train、X_test、y_test,以及一份可复现的划分说明。

3. 模型设计:CNN 与 DNN 两条路怎么选、怎么搭

3.1 为什么这份方案同时给了 cnn.py 和 dnn.py

cnn.py和dnn.py代表两种思路。DNN 把一维信号直接展平成全连接层输入,结构简单,训练快,适合先跑通流程;CNN 用一维卷积核在信号上滑动,能自动提取局部冲击特征,通常效果更好。我一般会先跑 DNN 做基线,再上 CNN 对比。如果时间紧,直接以 CNN 为主,DNN 作为消融实验。

一维 CNN 的输入形状是(样本数, 信号长度, 1),卷积核沿时间轴滑动。下面是一个可用的 CNN 结构示例:

import tensorflow as tf from tensorflow.keras import layers, models def build_cnn(input_len, num_classes): model = models.Sequential([ layers.Input(shape=(input_len, 1)), # 第一层卷积:提取局部冲击特征 layers.Conv1D(32, kernel_size=7, activation='relu', padding='same'), layers.MaxPooling1D(pool_size=2), layers.Conv1D(64, kernel_size=5, activation='relu', padding='same'), layers.MaxPooling1D(pool_size=2), layers.Conv1D(128, kernel_size=3, activation='relu', padding='same'), layers.GlobalAveragePooling1D(), layers.Dropout(0.5), layers.Dense(64, activation='relu'), layers.Dense(num_classes, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) return model

卷积核大小决定感受野,第一层用 7 或 9 能覆盖一个冲击周期;池化层降低维度;GlobalAveragePooling1D替代展平层,减少参数量;Dropout防止过拟合。如果分类数少、样本少,可以把通道数减半。dnn.py则通常用两到三层全连接,输入是展平后的信号,结构简单但参数量大,容易过拟合,所以 Dropout 和早停更关键。

3.2 训练配置:损失函数、优化器与早停

多分类任务用sparse_categorical_crossentropy还是categorical_crossentropy,取决于标签是整数还是 one-hot。优化器用 Adam 起步,学习率 1e-3 是常见默认值。批次大小 32 或 64,训练轮数先设 100,配合早停。

from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint callbacks = [ EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True), ModelCheckpoint('best_model.h5', monitor='val_accuracy', save_best_only=True) ] history = model.fit(X_train, y_train, validation_split=0.2, epochs=100, batch_size=64, callbacks=callbacks)

patience=10表示验证损失连续 10 轮不下降就停,restore_best_weights=True保证拿回最优权重。ModelCheckpoint保存验证准确率最高的模型,避免训练后期过拟合。如果训练集准确率很高但验证集很低,先检查数据划分有没有泄漏,再考虑加 Dropout 或减模型容量。

3.3 特征可视化:plot_scatter.py 和 last_layer_data 的作用

plot_scatter.py通常用来画散点图,比如把最后一层特征用 t-SNE 或 PCA 降到二维,看不同类别是否分开。last_layer_data目录可能保存了倒数第二层的输出,方便你直接画图,不用重新跑模型。这一步在毕设答辩里很加分,因为准确率只是一个数字,特征分布图能直观说明模型学到了区分性信息。

我一般会这样做:加载last_layer_data里的特征和标签,用 t-SNE 降到二维,按类别上色。如果同类聚在一起、异类分开,说明模型提取的特征有效;如果混在一起,就要回头检查预处理或模型结构。散点图不需要多复杂,但坐标轴、图例、类别名称要标清楚,答辩时能省很多解释。

4. 实现落地:从 creat_data.py 到训练与预测的完整链路

4.1 数据生成脚本 creat_data.py 的拆解

creat_data.py是整条链路的起点。它通常做三件事:读取原始 CWRU 文件、按窗口切片、保存成统一格式。你拿到手后,先看它读文件的路径和标签映射,再改成本地路径。如果原始数据是.mat格式,会用scipy.io.loadmat;如果是.csv,用pandas.read_csv。关键是要保证每个文件对应的标签正确。

import scipy.io as sio import os def load_mat_signal(file_path, key='X'): """ 读取 .mat 文件中的振动信号 key: 数据在 mat 文件中的变量名,不同版本可能不同 """ mat = sio.loadmat(file_path) signal = mat[key].flatten() return signal

key这个参数很容易翻车,不同来源的.mat文件变量名不一样,有的是X,有的是DE_time。跑之前先print(mat.keys())看一眼,别硬猜。creat_data.py里通常还会把多个文件拼在一起,这时候要注意信号拼接处不要直接切片,否则会引入虚假冲击。

4.2 训练脚本 cnn.py 与 dnn.py 的调用关系

cnn.py和dnn.py一般会先加载creat_data.py生成的数据,再建模型、训练、评估。你可以在cnn.py里加一段命令行参数,方便切换数据集和超参数:

import argparse parser = argparse.ArgumentParser() parser.add_argument('--data', type=str, default='pre_data/train.npy') parser.add_argument('--epochs', type=int, default=100) parser.add_argument('--batch', type=int, default=64) args = parser.parse_args()

这样改参数不用动代码,答辩演示时也方便。训练完记得保存模型和训练历史,history.history可以画准确率、损失曲线,放进论文里。如果cnn.py和dnn.py共用数据加载逻辑,可以把公共部分抽到单独文件,避免改一处漏一处。

4.3 预测与结果输出:模型怎么给出故障类型

训练好的模型用model.predict()输出每个类别的概率,取最大值的索引就是预测类别。实际使用时,输入一段新信号,先做同样的切片和归一化,再送进模型。下面是一个预测示例:

import numpy as np def predict_signal(model, signal, window=1024): seg = signal[:window] seg = (seg - seg.min()) / (seg.max() - seg.min() + 1e-8) seg = seg.reshape(1, window, 1) prob = model.predict(seg, verbose=0) pred = np.argmax(prob) return pred, prob

注意输入形状要和训练时一致,CNN 是(1, window, 1),DNN 是(1, window)。如果预测结果总是同一类,先检查归一化是不是用了全局统计量,再检查模型有没有加载成功。使用说明.txt里通常会写清楚运行顺序,照着走一遍能省很多时间。

5. 避坑与排查:轴承故障诊断毕设最容易翻车的五个点

5.1 准确率虚高到 99% 以上

现象:训练集和测试集准确率都接近 100%,但换个负载或转速就崩。原因:同一段信号的切片同时进了训练集和测试集,数据泄漏。解决:按原始文件或工况划分数据集,训练集和测试集不共享任何原始文件。我一般会在划分后打印两边文件列表,确认没有交集。

5.2 损失不下降或变成 NaN

现象:训练几轮后 loss 变成 NaN,准确率不动。原因:学习率太大、输入没归一化、标签越界。解决:先把学习率降到 1e-4,检查输入幅值范围,确认标签在 0 到num_classes-1之间。如果用了categorical_crossentropy但标签是整数,也会出问题,换成sparse_categorical_crossentropy即可。

5.3 模型加载后预测结果全一样

现象:训练时准确率正常,保存再加载后预测全是同一类。原因:保存的是结构而不是权重,或者加载时没有编译。解决:用model.save('model.h5')保存完整模型,加载用tf.keras.models.load_model('model.h5')。如果只保存了权重,加载前要先建同样的结构。

5.4 可视化散点图类别混在一起

现象:plot_scatter.py画出来的图所有类别混成一团。原因:特征没归一化,或者 t-SNE 的 perplexity 设得不合适。解决:先对last_layer_data做标准化,再调perplexity,一般设 5 到 30 之间。如果还是混,说明模型没学好,回头检查数据预处理。

5.5 运行脚本报路径错误

现象:creat_data.py或cnn.py一跑就报FileNotFoundError。原因:原始数据路径、保存路径、模型路径写死了。解决:把所有路径改成相对路径或命令行参数,README.md和使用说明.txt里通常有目录结构说明,照着改。我习惯在脚本开头加os.chdir(os.path.dirname(__file__)),避免工作目录不对。

6. 验收与答辩:怎么证明这套方案真的能跑通

验收不是看准确率一个数字,而是看整条链路能不能复现。我一般会按下面这张表逐项检查,你也可以直接拿去当答辩前的自检清单:

检查项合格标准验证方式
数据读取能正确读取原始文件并打印信号长度运行creat_data.py,看输出样本数
标签映射每个类别样本数合理,无标签错位打印各类别计数,对照README.md
训练过程loss 稳定下降,验证集准确率有提升看history曲线
模型保存重新加载后预测结果一致保存后重新加载,对比预测
可视化散点图类别可分,图例清晰运行plot_scatter.py
跨工况换负载或转速后准确率不崩用不同工况文件测试

答辩时,老师最常问的是“为什么用 CNN 不用 LSTM”和“准确率这么高是不是数据泄漏”。第一个问题可以从振动信号的局部冲击特性回答,CNN 的卷积核适合提取局部特征;第二个问题直接展示你的划分方式,说明训练集和测试集按文件隔离。如果时间允许,把last_layer_data的散点图放出来,比单纯报准确率更有说服力。

还有一个小技巧:提前把cnn.py、dnn.py、creat_data.py的运行命令写成一个run.sh或README里的步骤,答辩现场按顺序跑一遍,避免手忙脚乱。我每次带项目验收,都会强制自己从空环境走一遍完整流程,包括装依赖、改路径、跑训练、看结果。有一次就是忘了改creat_data.py里的绝对路径,现场报错,后来我把所有路径都改成相对路径,再也没翻过车。希望这份拆解能帮你把毕设稳稳落地。

本文还有配套的精品资源,点击获取

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

WinGet完整指南:从下载安装到批量部署与自动化更新

Windows 自带的应用商店确实解决了一部分问题,但说实话,对于每天要装十几个软件、或者是运维一堆电脑的朋友来说,一个个去官网下载安装包,再点“下一步”的旧流程还是太耗费时间了。装上 WinGet 之后,我现在的习惯变成…

作者头像 李华
网站建设 2026/10/19 5:18:09

Vibe-Coding实战:五端协同开发的关键流程与踩坑复盘

今年圈子里聊开发,几乎绕不开 Vibe-Coding 这个词。给它一个不那么玄的解释:你把需求用自然语言讲清楚,AI 负责把代码生成出来,开发者负责拆需求、验结果、修边界,整个过程像顺着节奏走一样。真正让我改观的是手头一个…

作者头像 李华
网站建设 2026/10/19 5:18:01

AI编程教程仓库被AI助手推荐:内容组织与AI友好设计实操

1. 一个教程仓库被AI助手推荐,意味着什么先交代背景。我在代码托管平台上维护了一个AI编程入门教程仓库,从零开始写起,面向的是完全没接触过AI辅助编程的开发者。写了大概大半年,Star数慢慢爬到了两万出头。这个数字在开源圈不算什…

作者头像 李华
网站建设 2026/10/19 5:17:42

16类农作物目标检测数据集:YOLO格式标注与农业视觉实战

简介:这份农作物多类别目标检测数据集面向农业AI开发者、农业院校研究者及智能农机视觉模块工程师,用于解决农田场景下作物种类识别与定位的样本匮乏问题。数据集覆盖香蕉、豆类、茄子、辣椒、黄瓜、大蒜、生姜、玉米、洋葱、豌豆、菠萝、马铃薯、水稻、…

作者头像 李华
网站建设 2026/10/19 5:17:23

技术绘图设计全指南:从架构图到时序图的完整实践

1. 一张好图是怎么诞生的:聊聊 diagram-design 的完整思路做技术这些年,我越来越觉得画图这件事被很多人低估了。很多人以为 diagram-design 就是把几个框框连起来,用流程箭头串一串,看起来像那么回事就行。但实际工作中&#xff…

作者头像 李华
网站建设 2026/10/19 5:17:18

Git多账户配置全攻略:SSH密钥与身份隔离实战

很多人早晚会撞上这个尴尬:上午还在公司仓库提交代码,下午打开自己的开源项目改几行,手一快就用自己的全局提交身份出去了。回头再看远程平台上的提交记录,要么公司邮箱出现在个人项目里,要么个人昵称混进公司仓库&…

作者头像 李华