使用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
总结
以上文档包含了从数据集准备、模型构建、加载预训练权重、生成数据到结果可视化的所有步骤。希望这些详细的信息和代码能够帮助你顺利实施和优化你的滚动轴承故障诊断系统。
热门推荐
忘忧草的花语是什么?它的寓意和象征意义有哪些?
晏几道:北宋著名词人的生平与艺术成就
快速粘度分析仪(RVA)在米制品加工领域应用
黑咖啡是饭前喝还是饭后喝能起到减肥的作用
轻度二尖瓣反流是什么?如何诊断和预防?
申请公租房和廉租房的具体条件是什么?
将32位Windows10升级到64位版本的方法,就是这么简单
使用 Alt + Tab 切换在打开的窗口之间移动
四川自学考试考生报考流程是什么?
表层手术好还是飞秒好?和全飞/半飞有什么区别?要多少钱呢?
感冒药、眼药水、止痛片……扒开“日本神药”真相
项目材料怎么归档管理的
促进湾区合作,拓展跨境医疗,新风天域获“港投”战略投资
为心灵“充电”:心理能量的恢复指南
用普萘洛尔以后,社交不再恐惧!
“冰箱”的这里,要常常清洗,霉菌跑光光,家人也健康
关羽为何成为佛教寺庙中的伽蓝神?一段流传千年的民间传说
苏州15座火车站,您都知道吗?
黄灯到底该怎么走?解读网传"黄灯新规"
基本农田保护制度是什么
肚子胀胀的隐隐的不舒服怎么回事
如何分析政策变动对特定行业的影响
澳大利亚硕博连读项目推荐与申请要求
400万比250万,今年春节为啥西双版纳接待游客比三亚还多出150万
投机者的悲惨结局——为蝇头小利抛弃石家庄,救不过来的沧州雄狮
如何在家自制芝麻球?需要哪些配料和步骤?
ZIFs及其衍生物:未来锂离子电池负极材料的潜力
王者荣耀:嫦娥无法抵挡的反击策略
从负债众筹到《天国拯救2》:战马工作室的十年逆袭之路
知识或许不能改变命运,但民智可以