一维卷积神经网络直接读取mat文件并进行数据增强和归一化

本文介绍了一种自动化处理凯斯西储等大学轴承故障数据集的方法,通过Python和Keras实现数据预处理、归一化以及训练一维卷积神经网络。代码直接从Matlab文件加载数据,避免了手动转换到Excel的步骤,并提供了数据增强和归一化的功能。此外,还展示了网络模型的构建和训练过程,以及模型保存和评估的细节。
摘要由CSDN通过智能技术生成
  众多师弟师妹在使用一维卷积神经网络对凯斯西储,哥伦比亚等大学开源的轴承故障数据集进行故障诊断时,不知道该怎么把Matlab文件中的数据直接导进伸进网络进行训练。
   我之前也不会,我一直用matlab打开数据然后黏贴到EXCEL再进行数据增强和归一化,最终保存成CSV格式。在训练神经网络的时候直接读取归一化好的数据进行训练,虽然这样比较直观,而且只做一次数据集就可以满足所有形式神经网络的训练。
   但是,如果要研究自己发论文所提出来的神经网络模型的泛化能力、抗噪声能力、超参数寻优等问题的时候可能要不停的重新制作加噪声的数据集等等,这时候就比较麻烦。
   因此,本人自己编写了一段数据处理的代码,包括归一化,代码如下所示:    

众多师弟师妹在使用一维卷积神经网络对凯斯西储,哥伦比亚等大学开源的轴承故障数据集进行故障诊断时,不知道该怎么把Matlab文件中的数据直接导进伸进网络进行训练。
我之前也不会,我一直用matlab打开数据然后黏贴到EXCEL再进行数据增强和归一化,最终保存成CSV格式。在训练神经网络的时候直接读取归一化好的数据进行训练,虽然这样比较直观,而且只做一次数据集就可以满足所有形式神经网络的训练。
但是,如果要研究自己发论文所提出来的神经网络模型的泛化能力、抗噪声能力、超参数寻优等问题的时候可能要不停的重新制作加噪声的数据集等等,这时候就比较麻烦。
因此,本人自己编写了一段数据处理的代码,包括归一化,代码如下所示:

# -*- coding: utf-8 -*-
"""
Created on Tue Oct  5 14:21:26 2021

@author: Hebei University of Engineering
"""
import numpy as np
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import LSTM,Input,add,Dense,AveragePooling1D, Activation, Flatten, Convolution1D, Dropout,MaxPooling1D,BatchNormalization,GlobalAveragePooling1D,ZeroPadding1D
import tensorflow as tf#将tensorflow命名为tf
from keras.models import Sequential#导入序列函数
from keras.wrappers.scikit_learn import KerasClassifier#导入分类标签显示工具
from keras.utils import np_utils,plot_model#导入独热吗部分编辑函数
from sklearn.model_selection import cross_val_score,train_test_split,KFold#导入独热吗部分编辑函数
from sklearn.preprocessing import LabelEncoder#导入独热吗部分编辑函数
from keras.models import load_model#导入保存模型工具
from keras.models import model_from_json#导入保存模型工具
import matplotlib.pyplot as plt#导入画图工具
from sklearn.metrics import confusion_matrix#导入混淆矩阵,这段代码用不上
import itertools#这个我忘记了
from keras import layers#导入层
from keras.optimizers import SGD#导入优化器
import scipy.io as scio
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
data1 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata1')['DA09'] 
data2 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata2')['DA09']
data3 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata3')['DA09']
data4 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata4')['DA09'] 
data5 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata5')['DA09']
data6 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata6')['DA09']
data7 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata7')['DA09']
data8 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata8')['DA09']
data9 = scio.loadmat('C:/Users/1/Desktop/大论文作图/mydata9')['DA09']


 
#由于凯斯西储大学的轴承故障数据集(字典格式)中包含多个键['X097_DE_time']
#L=list()
 
def ber(data,windowlen,buchang):
    p=len(data)
    L=list()
    q=(p-windowlen)
    for i in range(q):
        if  int(i) % int(buchang) == 0:
            a=data[i:i+windowlen]          
            L.append(a)
    return L

def data(data,windowlen,buchang,biaoqian):
    data=ber(data,windowlen,buchang)
    data=np.array(data)
    x,y,z=data.shape
    c=data.reshape(x,y)
    for i in range(x):
        c1=c[i,:]
        pingjunzhi=np.mean(c1)
        c2=c1-pingjunzhi
        c3=max(abs(c2))
        c1=c2/c3
        c[i,:]=c1
    k=np.zeros((x,1))+biaoqian
    KK=np.hstack([c,k])
    print(k)
    print(KK.shape)
    return KK
    
yb1=data(data1,1024,24,1)
yb2=data(data2,1024,24,2)
yb3=data(data3,1024,24,3)
yb4=data(data4,1024,24,4)
yb5=data(data5,1024,24,5)
yb6=data(data6,1024,60,6)
yb7=data(data7,1024,72,7)
yb8=data(data8,1024,72,8)
yb9=data(data9,1024,72,9)

L3=np.vstack([yb1,yb2,yb3,yb4,yb5,yb6,yb7,yb8,yb9])
X = np.expand_dims(L3[:, 0:1024].astype(float), axis=2)#每行的1-1024列作为训练数据
Y = L3[:, 1024]#每行的第1025列作为训练标签

encoder = LabelEncoder()
Y_encoded = encoder.fit_transform(Y)
Y_onehot = np_utils.to_categorical(Y_encoded)
 
#划分数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y_onehot, test_size=0.3, random_state=0)
 

seed = 7
np.random.seed(seed)
 
def Conv2d_BN(x, nb_filter,kernel_size, strides=1, padding='same',name=None):
    if name is not None:
        bn_name = name + '_bn'
        conv_name = name + '_conv'
    else:
        bn_name = None
        conv_name = None
 
    x = Convolution1D(nb_filter,kernel_size,padding=padding,strides=strides,activation='tanh',name=conv_name)(x)
    x = MaxPooling1D(pool_size=2,strides=1,padding='same')(x)
    x = BatchNormalization(axis=1,name=bn_name)(x)
    return x
 
def Conv_Block(inpt,nb_filter,kernel_size,strides=1, with_conv_shortcut=False):
    x = Conv2d_BN(inpt,nb_filter=nb_filter,kernel_size=1,strides=strides,padding='same')
    x = Conv2d_BN(x, nb_filter=nb_filter, kernel_size=3, padding='same')
    x = Conv2d_BN(x, nb_filter=nb_filter, kernel_size=1, padding='same')
    if with_conv_shortcut:
        shortcut = Conv2d_BN(inpt,nb_filter=nb_filter,strides=strides,kernel_size=kernel_size)
        x = add([x,shortcut])
        return x
    else:
        x = add([x,inpt])
        return x
 
inpt = Input(shape=(1024,1))
x = ZeroPadding1D(3)(inpt)
x = Dropout(0.5)(x)
x = Conv2d_BN(x,nb_filter=16,kernel_size=64,strides=8,padding='same')
x = Conv_Block(x,nb_filter=32,kernel_size=32,strides=1,with_conv_shortcut=True)
x = Conv_Block(x,nb_filter=64,kernel_size=3,strides=1,with_conv_shortcut=True)
x = Conv_Block(x,nb_filter=64,kernel_size=3,strides=1,with_conv_shortcut=True)
x = Conv_Block(x,nb_filter=64,kernel_size=3,strides=1,with_conv_shortcut=True)
x = Conv_Block(x,nb_filter=64,kernel_size=3,strides=1,with_conv_shortcut=True)
x = Conv_Block(x,nb_filter=64,kernel_size=3,strides=1,with_conv_shortcut=True)
x = Flatten()(x)
x = BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)(x) 
x=Dense(100,activation='tanh')(x)
x = BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)(x) 
x=Dropout(0.5)(x)
x=Dense(60,activation='tanh')(x)
x = BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)(x) 
x=Dropout(0.5)(x)
x = Dense(9,activation='softmax')(x)

from keras.models import Model 
model = Model(inputs=inpt,outputs=x)
model.summary()

model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])

from keras.callbacks import TensorBoard
import time
import keras
model_name = "模型名-{}".format(int(time.time()))
tensorboard = TensorBoard(log_dir='logs'.format(model_name),write_images='Ture')
tensorboard=keras.callbacks.TensorBoard(histogram_freq=1)
history=model.fit(X_train, Y_train,epochs=600,validation_data=(X_test, Y_test),batch_size=512,callbacks=[tensorboard])
#训练批量大小和批次
#history=model.fit(X_train, Y_train,epochs=100,validation_data=(X_test, Y_test),batch_size=64)

#model.save('C:/Users/1/Desktop/加速度传感器4.h5')
model_json =model.to_json()
with open('C:/Users/1/Desktop/大论文作图/传感器9', 'w')as json_file:
    json_file.write(model_json)# 权重不在json中,只保存网络结构
model.save_weights('C:/Users/1/Desktop/大论文作图/传感器9.json.h5')
#画出损失函数图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(history.history['loss'],'_',label='train_loss')
plt.plot(history.history['val_loss'],':',label='val_loss')
plt.plot(history.history['accuracy'],'.',label='train_acc')
plt.plot(history.history['val_accuracy'],'r',label='val_acc')
plt.show()

los=history.history['val_loss']
Aos=history.history['val_accuracy']
a=history.history['loss']
b=los=history.history['val_loss']
print(b)

有人要问没看见给形成的数据进行打乱顺序,这一点不用担心,在代码的第90行,划分数据集的时候是随机选择并打乱顺序的。

省刊
核心
EI
SCI
师弟师妹赶紧发吧

  • 17
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
要在Matlab中实现一维数据增强,可以按照以下步骤进行操作: 1. 打开凯斯西储轴承故障数据文件,可以使用Matlab的load函数加载.mat文件。 2. 将数据Matlab中黏贴到Excel表格中,可以使用xlswrite函数将数据写入Excel文件。 3. 在Excel表格中进行数据剪段(也称为滑动窗口),可以使用OFFSET函数。假设你想要每个窗口的长度为window_length,滑动步长为slide_step。在Excel中,在B1单元格中输入以下公式: =OFFSET($A$1,ROW(A1)-1 COLUMN(A1)*slide_step-slide_step,window_length) 然后,将该公式向下拖拽到你想要的数据长度位置,同时向右拖拽直到某一行中出现0为止。这样就完成了数据增强,你可以裁剪出多个样本。 4. 在Excel中进行归一化处理,可以根据你的需求将数据归一化到(0,1)或[-1,1]之间。你可以使用Excel自带的函数或者自己编写VBA宏来实现归一化。 5. 将归一化数据再次黏贴回Excel中的其他工作表,点击A1单元格,然后粘贴为值,以去除公式编辑。 6. 将第5步中的数据进行转置黏贴到一个新的工作表中。你可以选择一个没有数据的工作表,点击A1单元格,然后进行转置黏贴。 7. 对数据进行标签,你可以在第1025列中添加标签,例如"滚珠故障"。将标签拖拽至你希望的行数,然后保存文件为CSV格式。 这样,你就可以在Matlab中使用数据增强后的一维数据进行进一步的处理和训练了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [一维卷积神经网络直接读取mat文件进行数据增强归一化](https://blog.csdn.net/qq_45714906/article/details/120624748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [傅里叶变换三维测量matlab代码-zqwc:我的主页](https://download.csdn.net/download/weixin_38654589/18928499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于EXCEL表格的一维数字信号数据增强处理](https://blog.csdn.net/qq_45714906/article/details/116090783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让我顺利毕业吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值