将机械振动信号基于一维卷积神经网络分类预测*采用一维卷积神经网络训练振动信号分为两类
2020年7月16日,第一学期没等到开学,又放假了。
总览CSDN大多数卷积神经网络对二维图像进行分类,但图像也是常见的猫狗分类,属于minst手写数字分类。 卷积神经网络的使用非常少见,也可分为IDMB情感分类和鸢尾。
作者就读于河北省双飞,在全国排名第270多位。 哈哈,不吹也不吹。
在网上查也找不到可以用来研究我的机器故障诊断的代码,但是之后,没办法只能去某个宝藏搜索代码,使用了。 这段代码是对鸢尾进行改造后分类的,直观性强,本人天资愚钝的人很容易得到。 通常直接访问代码。
importnumpyasnpimportpandasaspdfromsklearn.preprocessingimportlabelencoderfromsklearn.preprocessingimportstandardscalerfrorfrorn ufflesplitfromkeras.modelsimportsequentialfromkeras.layersimportdense,Activation,Flatten,Flatten MaxPooling1D, btchnormalizationfromkeras.optimizersimportsgdfromkeras.utilsimportnp _ utilsfromkeras.modelsimportload _ model train USS 培训集test=PD.read _ CSV (c :/users/PC/desktop/导入100test.CSV ' )的test ) : label _ encoder=label encoder (.fit (train.species ) labels=label _ encoder.) n=train.drop(['species ',' id'],axis=1) test=test.drop ),axis=1)返回train,labels,t train claseses test ) scaled_train=train.values# SSS将每个数据集的30%用作测试SSS=stratifiedshufflesplit ) test_sizlit valid _ indexinsss.split (scaled _ train,labels ) : X_train,x _ valin scaled _ train [ valid _ index ] y _ train labels [ valid _ index ] nb _ features=64nb _ class=len (classes ) # reshape train data这里的128稍微强调了一下,64*2=128,数据在此,为什么,我们要在代码下详细介绍x_train _ r=NP.zeros ((len (x _ train ),nb_features,3 ) ) x _ train? nb _ features 3360128 ] x _ train _ r [ 128: ] print (x _ train _ r ) reshapevalidationdatax _ valid _ r=NP.zeratid 3360 nb _ features ] x _ valid _ r [ :1 ]=x _ valid [ :nb _ features 3360128 ] x _ valid _ r [ 12365292;
用tanh是个不错的选择model.add(MaxPooling1D(2,strides=2,padding='same'))model.add(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))model.add(Convolution1D(32,3,padding='same'))model.add(Activation('tanh'))model.add(MaxPooling1D(2,strides=2,padding='same'))model.add(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))model.add(Flatten())model.add(Dropout(0.3))model.add(Dense(100, activation='tanh'))model.add(Dense(10, activation='tanh'))model.add(Dense(nb_class))model.add(Activation('softmax'))model.summary()y_train = np_utils.to_categorical(y_train, nb_class)#这里是将数据集中的标签做成独热码,直接黏贴就好了y_valid = np_utils.to_categorical(y_valid, nb_class)sgd = SGD(lr=0.01, nesterov=True, decay=1e-6, momentum=0.9)model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])nb_epoch = 150model.fit(X_train_r, y_train, nb_epoch=nb_epoch, validation_data=(X_valid_r, y_valid), batch_size=32)model.save('fei100_model.h5')#将训练好的模型保存,不想保存的话可以在代码前加上#前十行没什么可说的,导入乱七八糟的函数,日常不管用不用的到瞎鸡导入,不会影响训练。
这里说明为什么上面将长度为192的代码分成三个长度为64的在重整成一个三维矩阵加载进第一个卷积层:
在鸢尾花分类的时候是有三大个明显特征的,这里用长、宽、高代替,因为原本是什么,本人记不清楚了,懒得去查,也不重要了。那么问题来了,这是在训练振动信号不用将192长的信号再分成三段了,于是本人将代码进行改变,将原本reshape部分删除,将第一个卷积层的输入改成1维,中间过程不堪入目,终于两天后我放弃了,总是维度有问题,就是无法将(175,192)的数据输入到(1,192)的卷积层中,然后又将(175,192)的信号曾了个维度还是不行,在此希望成功的小伙伴在下面评论一下,或者把代码发本人邮箱983401858@qq.com哈哈哈哈。
关于振动信号采用激活函数tanh是因为,本人尝试了relu,和sigmod但发现,效果并没有tanh好,为什么不好,同样好在哪里,就不一一赘述了。
下面,用训练好的模型去预测新收集到的振动信号,当然了,并没有真的做实验去获得新数据,是从原有数据中摘取出一部分。预测用的代码如下:
import pandas as pdimport numpy as npfrom sklearn.preprocessing import StandardScalerfrom keras.models import load_model,Sequentialfrom keras.layers import Dense, Activation, Flatten, Convolution1D, Dropout,MaxPooling1D,BatchNormalizationc = pd.read_csv('C:/Users/pc/Desktop/10000.csv')a=np.array(c)b=a.reshape(-1,64,3)model=Sequential()model = load_model("fei100_model.h5")predict=model.predict(b)呐,这就基本上完成了。
本人简单的贴一下预测结果
其中0代表信号中的bad,1代表信号中的good
数据在没测试前的标签如下图
选择的是2-21行,这样就是20个样本进行验证。可以看出预测的和原本的不太一致,预测过程中将第一行直接转移到了最后一行,奇奇怪怪令人不解,其中还有个预测的概率为0.6多。这样就在研究我的课题时变相的迈了一小步。
细心的朋友可能早就发现,本人将代码里的归一化,标准化删除了,哈哈哈,卖个乖,本人的研究中发现了一种标准化方法,还在测试阶段,不一定理想。所以将数据直接用matlab归一化和标准化好了。图片中的数据使用的用每个值减去最小值除以最大值得来的。虽然做起来麻烦,但是这样做的好处倒也是有的,那就是在测试的程序中不用再添加训练时的归一化标准化程序。往往在训练的程序中进行归一化处理,再到预测程序中进行归一化,往往得到一些奇奇怪怪的预测结果。
数据集的连接:
https://pan.baidu.com/s/18rkiU9gROfSMQhZ5nDzEsg
提取码sbun
永久有效
第一次写博客分享研究生一年来,做出的丁点成果。希望看过这篇帖子的同志在下面评论,共同学习,共同进步。我导师带研究生在3届,然而研三rqdxgz半年没见到就毕业了。研二rqdxgz做老师的另外一个课题。老师赴美学习被堵到了国外。这学上的稀里糊涂,难受的丫批。
有问题评论区指出,共同讨论,本人虚心受教