使用WGAN-GP生成一维滚动轴承振动数据样本
创作时间:
作者:
@小白创作中心
使用WGAN-GP生成一维滚动轴承振动数据样本
引用
CSDN
1.
https://blog.csdn.net/QQ_1309399183/article/details/144684295
本文将介绍如何使用WGAN-GP(Wasserstein GAN with Gradient Penalty)生成一维滚动轴承振动数据样本。我们将以西储大学(CWRU)数据集为例,并提供一个基于训练好的权重参数文件进行测试的代码。
步骤概述
- 数据集准备
- 构建WGAN-GP模型
- 加载预训练权重
- 生成指定故障类型的数据
- 可视化生成的数据
详细步骤
1. 数据集准备
确保你的数据集已经按照上述格式准备好,并且包含相应的文件目录结构。
bearing_datasets/
├── CWRU/
│ ├── normal.mat
│ ├── inner_race_fault.mat
│ └── ...
└── generated_data/
├── normal.npy
├── inner_race_fault.npy
└── ...
2. 构建WGAN-GP模型
使用Keras构建一个简单的WGAN-GP模型。
import os
import numpy as np
import pandas as pd
import scipy.io as sio
from sklearn.preprocessing import StandardScaler, LabelEncoder
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Reshape, Flatten
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.constraints import Constraint
import tensorflow as tf
# Step 1: Data Preparation
# Ensure your dataset is organized as described above.
# Load and preprocess data
def load_cwru_data(dataset_path):
features = []
labels = []
for filename in os.listdir(dataset_path):
if filename.endswith('.mat'):
data = sio.loadmat(os.path.join(dataset_path, filename))
signal = data[list(data.keys())[-1]].flatten()
label = filename.split('_')[0] # Assuming label is part of the filename
features.append(signal)
labels.append(label)
return np.array(features), np.array(labels)
cwru_features, cwru_labels = load_cwru_data('bearing_datasets/CWRU')
# Encode labels
label_encoder = LabelEncoder()
cwru_labels_encoded = label_encoder.fit_transform(cwru_labels)
# Normalize features
scaler = StandardScaler()
cwru_features_normalized = scaler.fit_transform(cwru_features)
# Reshape features to include time dimension
cwru_features_reshaped = cwru_features_normalized.reshape(-1, cwru_features_normalized.shape[1], 1)
# Step 2: Build WGAN-GP Model
class ClipConstraint(Constraint):
def __init__(self, clip_value):
self.clip_value = clip_value
def __call__(self, weights):
return tf.clip_by_value(weights, -self.clip_value, self.clip_value)
def build_generator(latent_dim, output_shape):
model = Sequential()
model.add(Dense(128, activation='relu', input_dim=latent_dim))
model.add(Dense(256, activation='relu'))
model.add(Dense(512, activation='relu'))
model.add(Dense(output_shape, activation='tanh'))
return model
def build_discriminator(input_shape):
model = Sequential()
model.add(Flatten(input_shape=input_shape))
model.add(Dense(512, activation='relu', kernel_constraint=ClipConstraint(0.01)))
model.add(Dense(256, activation='relu', kernel_constraint=ClipConstraint(0.01)))
model.add(Dense(1))
return model
def wasserstein_loss(y_true, y_pred):
return tf.reduce_mean(y_true * y_pred)
def gradient_penalty_loss(y_true, y_pred, averaged_samples, weight):
gradients = tf.gradients(y_pred, averaged_samples)[0]
gradients_sqr = tf.square(gradients)
gradient_penalty = tf.reduce_mean(tf.reduce_sum(gradients_sqr, axis=np.arange(1, len(gradients_sqr.shape))))
return weight * gradient_penalty
latent_dim = 100
output_shape = cwru_features_reshaped.shape[1]
generator = build_generator(latent_dim, output_shape)
discriminator = build_discriminator((output_shape, 1))
discriminator.compile(loss=wasserstein_loss, optimizer=Adam(lr=0.0001, beta_1=0.5), metrics=['accuracy'])
discriminator.trainable = False
gan_input = Input(shape=(latent_dim,))
generated_signal = generator(gan_input)
validity = discriminator(generated_signal)
combined = Model(gan_input, validity)
combined.compile(loss=wasserstein_loss, optimizer=Adam(lr=0.0001, beta_1=0.5))
3. 加载预训练权重
假设你已经有了预训练的权重文件 generator_weights.h5 和 discriminator_weights.h5。
# Load pre-trained weights
generator.load_weights('generator_weights.h5')
discriminator.load_weights('discriminator_weights.h5')
4. 生成指定故障类型的数据
生成指定故障类型的数据,并保存到 generated_data 目录中。
# Function to generate data
def generate_data(generator, latent_dim, num_samples, fault_type, label_encoder, output_dir):
noise = np.random.normal(0, 1, (num_samples, latent_dim))
generated_signals = generator.predict(noise)
# Decode labels to get fault type index
fault_index = label_encoder.transform([fault_type])[0]
# Save generated signals
np.save(os.path.join(output_dir, f"{fault_type}.npy"), generated_signals)
return generated_signals
# Generate data for a specific fault type
fault_type = 'inner_race_fault' # Change this to any fault type you want to generate
num_samples = 1000 # Number of samples to generate
generated_signals = generate_data(generator, latent_dim, num_samples, fault_type, label_encoder, 'generated_data')
5. 可视化生成的数据
可视化生成的数据并与真实数据进行对比。
# Plot real and generated data
import matplotlib.pyplot as plt
# Select a random sample from real data
real_sample_idx = np.random.randint(0, len(cwru_features_reshaped))
real_sample = cwru_features_reshaped[real_sample_idx].flatten()
# Select a random sample from generated data
generated_sample_idx = np.random.randint(0, len(generated_signals))
generated_sample = generated_signals[generated_sample_idx].flatten()
# Plot
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(real_sample)
plt.title('Real Sample')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.subplot(1, 2, 2)
plt.plot(generated_sample)
plt.title('Generated Sample')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.tight_layout()
plt.show()
完整代码
以下是完整的代码示例,包含了从数据加载、模型构建、加载预训练权重、生成数据到结果可视化的所有步骤。
运行脚本
在终端中运行以下命令来执行整个流程:
python main.py
总结
以上文档包含了从数据集准备、模型构建、加载预训练权重、生成数据到结果可视化的所有步骤。希望这些详细的信息和代码能够帮助你顺利实施和优化你的滚动轴承故障诊断系统。
热门推荐
《永乐大典》载蒸汽机?谣言背后的科技史真相
打击乐艺考全攻略:专业方向、考试内容与备考建议
跑步与快走哪个效果好?
养花必看:23种石材类植料详解
什么是网络安全等级保护?
潘晓婷:从“九球天后”到全能艺人的台球传奇
肚子胀满疼痛、没有食欲,名医李东垣:7味中药,还你健康的脾胃
改良版蒙古牛肉干(干粮版)制作方法
小学生考试复习指南:六大错误要避免,三大要点要记牢
从心理学视角来分析:宠物长得越来越像主人
狗狗和主人的互动体现在心率差异上
为何针灸成为荨麻疹治疗的新趋势?中医视角解析
低空经济 政策梳理
汽车容量升数的准确计算方法及适用情况
被人讹钱不还的怎么办
马桶正对着门好不好——购房装修需注意的风水讲究
美西战争背景及其对国际格局的影响
企业财务审查是什么?目的、流程及注意事项全解析
烨的多个读音,有着一段饶有趣味的演变历程
家里的不锈钢餐具做不到这1点,建议你换掉
厨房为什么吊顶很矮(厨卫吊顶选材与高度如何选择?)
内观疗法在精神心理疾病治疗中的应用
算力可共享,视觉也AI,数据能流动,来听听浙江的“造新”故事
双通道内存有什么优点和缺点
三国辉煌:刘备的五虎大将
胃食管反流与幽门螺杆菌有关系吗?
全国最新数据来了!最有钱的是……你的收入达标了吗?
员工被迫离职如何举证?工资结算与补偿金标准全解析
6个科学有效的减肥方法,助你轻松燃烧卡路里
AI领域最强者是谁?揭秘人工智能的顶尖选手