尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
滚动轴承故障检测 基于双路神经网络滚动轴承故障诊断系统 系统融合原始振动信号和二维时频图像进行多输入(多通道)故障诊断。PyTorch框架实现模型,可单双路
基于双路神经网络的滚动轴承故障诊断文章目录基于双路神经网络的滚动轴承故障诊断文字及内容代码仅供参考1. 数据准备2. 完整代码实现2.1 数据加载和预处理2.2 模型构建2.3 模型训练2.4 结果可视化运行步骤实际运行情况如图融合了原始振动信号 和 二维信号时频图像 的多输入(多通道)故障诊断方法单路和双路都可时频图像算法可选小波变换短时傅里叶变换马尔可夫变迁场格拉姆角场S变换递归图等预处理不提供数据集可选凯斯西储大学东南大学江南大学等等使用 Pytorch和Tensorflow框架构建一个基于双路神经网络的滚动轴承故障诊断系统。该系统将融合原始振动信号和二维时频图像进行多输入多通道故障诊断。使用PyTorch框架来实现这个模型单路和双路两种模式都可文字及内容代码仅供参考1. 数据准备假设我们有一个滚动轴承振动信号数据集其中包含正常和故障样本。数据集格式如下datasets/ └── case_western_reserve_university/ ├── train/ │ ├── normal/ │ ├── outer_race_fault/ │ ├── inner_race_fault/ │ └── ball_fault/ ├── val/ │ ├── normal/ │ ├── outer_race_fault/ │ ├── inner_race_fault/ │ └── ball_fault/ └── test/ ├── normal/ ├── outer_race_fault/ ├── inner_race_fault/ └── ball_fault/每个文件夹中包含多个.npy文件每个文件是一个形状为(timesteps, features)的数组。同时我们还需要生成相应的二维时频图像。2. 完整代码实现以下是完整的Python代码包括数据加载、预处理、模型构建、训练和评估。您可以直接运行此代码。2.1 数据加载和预处理[titleData Loading and Preprocessing]importosimportnumpyasnpfromsklearn.preprocessingimportStandardScalerfromkeras.utilsimportto_categoricalimporttorchfromtorch.utils.dataimportDataset,DataLoaderimporttorchvision.transformsastransformsfromscipy.signalimportstftimportmatplotlib.pyplotasplt# Load data from .npy filesdefload_data(data_dir,classes):X[]y[]forlabel,clsinenumerate(classes):class_diros.path.join(data_dir,cls)filesos.listdir(class_dir)forfileinfiles:filepathos.path.join(class_dir,file)datanp.load(filepath)X.append(data)y.append(label)Xnp.array(X)ynp.array(y)returnX,y# Preprocess time-domain signalsdefpreprocess_signals(X_train,X_val,X_test):scalerStandardScaler()n_timesteps,n_featuresX_train.shape[1],X_train.shape[2]X_trainscaler.fit_transform(X_train.reshape(-1,n_features)).reshape(-1,n_timesteps,n_features)X_valscaler.transform(X_val.reshape(-1,n_features)).reshape(-1,n_timesteps,n_features)X_testscaler.transform(X_test.reshape(-1,n_features)).reshape(-1,n_timesteps,n_features)returnX_train,X_val,X_test# Generate STFT images from time-domain signalsdefgenerate_stft_images(X):stft_images[]forsignalinX:f,t,Zxxstft(signal[:,0],fs1000,nperseg256,noverlap128)magnitude_spectrogramnp.abs(Zxx)normalized_image(magnitude_spectrogram-np.min(magnitude_spectrogram))/(np.max(magnitude_spectrogram)-np.min(magnitude_spectrogram))stft_images.append(normalized_image)returnnp.array(stft_images)# Custom dataset classclassBearingDataset(Dataset):def__init__(self,X_signal,X_image,y,transformNone):self.X_signalX_signal self.X_imageX_image self.yy self.transformtransformdef__len__(self):returnlen(self.y)def__getitem__(self,idx):signalself.X_signal[idx]imageself.X_image[idx]labelself.y[idx]ifself.transform:imageself.transform(image)returnsignal,image,label# Load and preprocess classification dataclasses[normal,outer_race_fault,inner_race_fault,ball_fault]data_dirdatasets/case_western_reserve_universityX_train_class,y_train_classload_data(os.path.join(data_dir,train),classes)X_val_class,y_val_classload_data(os.path.join(data_dir,val),classes)X_test_class,y_test_classload_data(os.path.join(data_dir,test),classes)y_train_classto_categorical(y_train_class,num_classeslen(classes))y_val_classto_categorical(y_val_class,num_classeslen(classes))y_test_classto_categorical(y_test_class,num_classeslen(classes))X_train_class,X_val_class,X_test_classpreprocess_signals(X_train_class,X_val_class,X_test_class)# Generate STFT imagesX_train_imagegenerate_stft_images(X_train_class)X_val_imagegenerate_stft_images(X_val_class)X_test_imagegenerate_stft_images(X_test_class)# Create datasets and dataloaderstransformtransforms.Compose([transforms.ToTensor(),])train_datasetBearingDataset(X_train_class,X_train_image,y_train_class,transformtransform)val_datasetBearingDataset(X_val_class,X_val_image,y_val_class,transformtransform)test_datasetBearingDataset(X_test_class,X_test_image,y_test_class,transformtransform)train_loaderDataLoader(train_dataset,batch_size32,shuffleTrue)val_loaderDataLoader(val_dataset,batch_size32,shuffleFalse)test_loaderDataLoader(test_dataset,batch_size32,shuffleFalse)2.2 模型构建[titleModel Construction]importtorch.nnasnnimporttorch.nn.functionalasF# Single-channel CNN modelclassSingleChannelCNN(nn.Module):def__init__(self,input_shape,num_classes):super(SingleChannelCNN,self).__init__()self.conv1nn.Conv1d(in_channelsinput_shape[1],out_channels64,kernel_size5,padding2)self.poolnn.MaxPool1d(kernel_size2)self.dropoutnn.Dropout(p0.2)self.fc1nn.Linear(64*(input_shape[0]//2),128)self.fc2nn.Linear(128,num_classes)defforward(self,x):xself.pool(F.relu(self.conv1(x)))xself.dropout(x)xx.view(x.size(0),-1)xF.relu(self.fc1(x))xself.dropout(x)xself.fc2(x)returnx# Two-channel CNN BiLSTM Attention modelclassDualChannelCNNBiLSTMAtt(nn.Module):def__init__(self,input_shape_signal,input_shape_image,num_classes):super(DualChannelCNNBiLSTMAtt,self).__init__()# Signal branchself.signal_conv1nn.Conv1d(in_channelsinput_shape_signal[1],out_channels64,kernel_size5,padding2)self.signal_poolnn.MaxPool1d(kernel_size2)self.signal_dropoutnn.Dropout(p0.2)self.signal_lstmnn.LSTM(input_size64,hidden_size64,bidirectionalTrue,batch_firstTrue)self.signal_attentionself.attention_3d_block# Image branchself.image_conv1nn.Conv2d(in_channels1,out_channels64,kernel_size(5,5),padding2)self.image_poolnn.MaxPool2d(kernel_size(2,2))self.image_dropoutnn.Dropout(p0.2)self.image_flattennn.Flatten()self.image_fc1nn.Linear(64*(input_shape_image[0]//2)*(input_shape_image[1]//2),128)# Combined branchself.fc_combined1nn.Linear(128*2,256)self.fc_combined2nn.Linear(256,num_classes)defattention_3d_block(self,inputs):# inputs.shape (batch_size, seq_len, feature_dim)single_attention_vectorFalseattention_weightsF.tanh(self.dense(inputs))attention_weightsattention_weights.permute(0,2,1)attention_weightsF.softmax(attention_weights,dim-1)context_vectortorch.bmm(attention_weights,inputs)ifsingle_attention_vector:context_vectorcontext_vector.squeeze(1)else:context_vectorcontext_vector.permute(0,2,1)returncontext_vectordefdense(self,inputs):returnnn.Linear(inputs.shape[-1],1)(inputs)defforward(self,signal,image):# Signal branchsignalself.signal_pool(F.relu(self.signal_conv1(signal)))signalself.signal_dropout(signal)signal,_self.signal_lstm(signal)signal_attself.signal_attention(signal)signal_flatsignal_att.view(signal_att.size(0),-1)# Image branchimageself.image_pool(F.relu(self.image_conv1(image.unsqueeze(1))))imageself.image_dropout(image)image_flatself.image_flatten(image)image_outF.relu(self.image_fc1(image_flat))# Combined branchcombinedtorch.cat((signal_flat,image_out),dim1)combinedF.relu(self.fc_combined1(combined))combinedself.fc_combined2(combined)returncombined# Define modelsinput_shape_signalX_train_class.shape[1:]input_shape_imageX_train_image.shape[1:]single_channel_cnnSingleChannelCNN(input_shape_signal,num_classes)dual_channel_cnn_bilstm_attDualChannelCNNBiLSTMAtt(input_shape_signal,input_shape_image,num_classes)print(single_channel_cnn)print(dual_channel_cnn_bilstm_att)2.3 模型训练[titleModel Training]importtorch.optimasoptim# Function to train a modeldeftrain_model(model,train_loader,val_loader,criterion,optimizer,num_epochs50):devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)model.to(device)best_acc0.0best_model_wtscopy.deepcopy(model.state_dict())forepochinrange(num_epochs):print(fEpoch{epoch}/{num_epochs-1})print(-*10)# Each epoch has a training and validation phaseforphasein[train,val]:ifphasetrain:model.train()# Set model to training modeelse:model.eval()# Set model to evaluate moderunning_loss0.0running_corrects0# Iterate over data.forsignals,images,labelsintrain_loaderifphasetrainelseval_loader:signalssignals.float().to(device)imagesimages.float().to(device)labelstorch.tensor(labels.argmax(axis1)).long().to(device)# Zero the parameter gradientsoptimizer.zero_grad()# Forwardwithtorch.set_grad_enabled(phasetrain):outputsmodel(signals,images)_,predstorch.max(outputs,1)losscriterion(outputs,labels)# Backward optimize only if in training phaseifphasetrain:loss.backward()optimizer.step()# Statisticsrunning_lossloss.item()*signals.size(0)running_correctstorch.sum(predslabels.data)epoch_lossrunning_loss/len(train_loader.datasetifphasetrainelseval_loader.dataset)epoch_accrunning_corrects.double()/len(train_loader.datasetifphasetrainelseval_loader.dataset)print(f{phase}Loss:{epoch_loss:.4f}Acc:{epoch_acc:.4f})# Deep copy the modelifphasevalandepoch_accbest_acc:best_accepoch_acc best_model_wtscopy.deepcopy(model.state_dict())print()print(fBest val Acc:{best_acc:4f})# Load best model weightsmodel.load_state_dict(best_model_wts)returnmodel# Train single-channel CNNcriterionnn.CrossEntropyLoss()optimizer_singleoptim.Adam(single_channel_cnn.parameters(),lr0.001)print(Training Single-Channel CNN...)single_channel_cnntrain_model(single_channel_cnn,train_loader,val_loader,criterion,optimizer_single)# Train dual-channel CNN BiLSTM Attentionoptimizer_dualoptim.Adam(dual_channel_cnn_bilstm_att.parameters(),lr0.001)print(\nTraining Dual-Channel CNN BiLSTM Attention...)dual_channel_cnn_bilstm_atttrain_model(dual_channel_cnn_bilstm_att,train_loader,val_loader,criterion,optimizer_dual)2.4 结果可视化[titleResult Visualization]importcopy# Evaluate models on test setdefevaluate_model(model,test_loader):devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)model.to(device)model.eval()running_corrects0withtorch.no_grad():forsignals,images,labelsintest_loader:signalssignals.float().to(device)imagesimages.float().to(device)labelstorch.tensor(labels.argmax(axis1)).long().to(device)outputsmodel(signals,images)_,predstorch.max(outputs,1)running_correctstorch.sum(predslabels.data)accrunning_corrects.double()/len(test_loader.dataset)print(fTest Accuracy:{acc:.4f})# Evaluate single-channel CNNprint(Evaluating Single-Channel CNN...)evaluate_model(single_channel_cnn,test_loader)# Evaluate dual-channel CNN BiLSTM Attentionprint(\nEvaluating Dual-Channel CNN BiLSTM Attention...)evaluate_model(dual_channel_cnn_bilstm_att,test_loader)# Plot example STFT imagesplt.figure(figsize(12,4))foriinrange(4):plt.subplot(1,4,i1)plt.imshow(X_train_image[i],cmapviridis)plt.title(classes[y_train_class[i].argmax()])plt.axis(off)plt.show()运行步骤确保数据集路径正确将您的数据集放在datasets/case_western_reserve_university目录下。确保.npy文件存在并且格式正确。安装必要的库确保您已经安装了所需的库如numpy,pandas,torch,matplotlib,scipy等。您可以使用以下命令安装这些库pipinstallnumpy pandas torch matplotlib scipy scikit-learn运行代码直接运行上述完整的代码即可完成数据加载、预处理、模型构建、训练和评估。
RELATED

相关推荐

从点应用走向意图驱动,Joule Work 正在重写 SAP 企业软件的人机交互方式

从点应用走向意图驱动,Joule Work 正在重写 SAP 企业软件的人机交互方式

2026 年 5 月的 SAP Sapphire 上,SAP 把 Joule Work 推到了一个非常关键的位置。过去谈 Joule,很多 SAP 从业者脑海里浮现出来的还是一个嵌入 SAP S/4HANA、SAP SuccessFactors、SAP BTP 等产品里的生成式 AI 助手,可以问问题,可以查业务数据,也可以帮助完成一些具体任务。…

📅 2026/8/23 7:23:15
STM32F405驱动24位DAC1220:高精度SPI接口实战与波形生成

STM32F405驱动24位DAC1220:高精度SPI接口实战与波形生成

1. 项目概述:从需求到方案选型 最近在做一个高精度信号源的项目,核心需求是生成一个超低噪声、超高分辨率的模拟电压。市面上常见的12位、16位DAC在音频或一般控制领域够用,但到了精密仪器、高端音频或者某些科研场景,其量化台阶带…

📅 2026/9/26 17:02:33
ProofCouncil:基于LLM多智能体协作的数学问题求解框架部署指南

ProofCouncil:基于LLM多智能体协作的数学问题求解框架部署指南

这次我们来看一个名为 ProofCouncil 的开源项目,它本质上是一个基于大语言模型(LLM)的智能体(Agent),专门设计用来解决开放的数学问题。简单来说,它不是一个单一的模型,而是一个由多…

📅 2026/10/9 4:26:41
MORE NEWS

更多资讯

📰

C++游戏开发中enum class实战:从传统enum坑到类型安全迁移

做游戏客户端这几年,C枚举是几乎每个系统都会用到的基础设施:角色状态、怪物AI、技能类型、消息通道、资源分类,随手一数就是一大串。以前项目里到处是C风格的enum,写起来确实爽——不用敲那么多字,还自动兼容整数。可…

📰

Android纵向滑动页面实战:三容器选型与避坑指南

简介:这是一份面向Android初中级开发者的纵向滑动页面实现资源,围绕ViewPager详细讲解如何构建上下滑动、翻页并显示页码的交互效果。压缩包内共61个文件,主要包括Java源码、XML布局与资源文件、编译生成的class与dex、android-support-v4.ja…

📰

低附着路面半挂汽车列车折叠失稳仿真与差动制动控制

我自己真正开始较真“半挂汽车列车横向稳定性控制”这个问题,是因为冬天在服务区门口亲眼看了一场折叠事故。一辆满载的半挂列车在匝道口的冰面上稍微带了点方向,挂车就开始左右甩,车头几乎被拽着转了180度,场面很吓人。从那以后&…

📰

OMA-VMD自动寻优:告别手动调参的变分模态分解实战

变分模态分解(VMD)这个算法,懂的人不少,但真正把它用好的人不多。十次上手有八次都卡在同一个地方:惩罚系数 alpha 和分解模态数 K 到底怎么定。K 拍脑袋给了个 5,alpha 随手填了 2000,结果分解…

📰

包管理器三剑客:npm、Yarn、pnpm底层原理与工程实践对比

1. 先想清楚一件事:包管理器到底在管什么做前端这些年,几乎每个新项目开工第一步就是npm install,可真正追问一句“包管理器是怎么工作的”,很多人其实答不上来。早年间我也只是把它当“下载依赖的神奇按钮”,直到后来…

📰

MySQL JDBC驱动版本与连接参数配置实战指南

简介:本资源是Java开发者连接MySQL数据库所需的官方JDBC驱动合集,面向初学者及企业级应用开发人员,解决Java项目中因驱动版本不匹配导致的连接失败、SQL异常或特性兼容问题。压缩包内含635个文件,主体为589个Java源码(…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬