一维卷积神经网络直接对mat文件进行训练(基于TICNN)

一维卷积神经网络直接对mat文件进行训练(基于TICNN)
什么叫离谱?
凯斯西储的轴承故障数据集好的离谱
哈工大研究生张伟提出的TICNN一维卷积神经网络正确率高的离谱,同时Loss小的离谱。
参考文献:
[1]Wei Zhang,Chuanhao Li,Gaoliang Peng,Yuanhang Chen,Zhujun Zhang. A deep convolutional neural network with new training methods for bearing fault diagnosis under noisy environment and different working load[J]. Mechanical Systems and Signal Processing,2018,100:
[2]张伟. 基于卷积神经网络的轴承故障诊断算法研究[D].哈尔滨工业大学,2017.
更离谱的两年了,我特么还在用EXCEL制作滑窗函数进行数据增强,太特么离谱了。
今天我终于不再使用EXCEL进行数据增强了
话不多说代码搞一波:

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.layers import Dense, SeparableConv1D,LSTM,Activation, Flatten, Convolution1D, Dropout,MaxPooling1D,BatchNormalization,GlobalAveragePooling1D#导入卷积层、全连接层、等等
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 numpy as np
import scipy.io as scio
import pandas as pd
data1 = scio.loadmat('C:/Users/1/Desktop/105')['X105_DE_time'] 
data2 = scio.loadmat('C:/Users/1/Desktop/106')['X106_DE_time'] 
#由于凯斯西储大学的轴承故障数据集(字典格式)中包含多个键['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

a=ber(data1,1024,6)
L1=np.array(a)
x,y,z=L1.shape
c=L1.reshape(x,y)
k=np.zeros((x,1))
KK=np.hstack([c,k])
print(k)
print(KK.shape)
b=ber(data2,1024,6)
L2=np.array(b)
XX,YY,ZZ=L2.shape
C=L2.reshape(XX,YY)
K=np.zeros((XX,1))+1
kk=np.hstack([C,K])
print(K)
print(kk.shape)
L3=np.vstack([KK,kk])
X = np.expand_dims(L3[:, 0:1024].astype(float), axis=2)#每行的1-1024列作为训练数据
Y = L3[:, 1024]#每行的第1025列作为训练标签
 
#把Y编辑成独热码,把标签做成二进制的独热码,有这一段,即使标签是汉字,仍然可以进行训练,否则不行
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)
#这一行的意思是,从读入的数据集中拿出30%作为测试集,剩下70%作为训练集。 

#卷积过程定义
model = Sequential()#使用序列函数,让数据按照序列排队输入到卷积层
model.add(Convolution1D(16, 64,strides=16,padding='same', input_shape=(1024, 1),activation='tanh'))#第一个卷积层
model.add(Dropout(0.5))#将经过第一个卷积层后的输出数据按照0.5的概率随机置零,也可以说是灭活
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))
#添加批量标准层,将经过dropout的数据形成正太分布,有利于特征集中凸显,里面参数不需要了解和改动,直接黏贴或者删去均可。
model.add(MaxPooling1D(2,strides=2,padding='same'))
#添加池化层,池化核大小为2步长为2,padding数据尾部补零。池化层不需要设置通道数,但卷积层需要。
model.add(Convolution1D(32,3,padding='same',activation='tanh'))#第二个卷积层,第二个卷积层则不在需要设置输入数据情况。
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))
#SeparableConv1D
model.add(Convolution1D(64, 3,padding='same',activation='tanh'))#第三个卷积层
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(MaxPooling1D(2,strides=2,padding='same'))
model.add(Convolution1D(64, 3,padding='same',activation='tanh'))#第四个卷积层
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(MaxPooling1D(2,strides=2,padding='same'))
model.add(Convolution1D(64,3,padding='same',activation='tanh'))#第五个卷积层
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(MaxPooling1D(2,strides=2,padding='same'))
model.add(Convolution1D(64,3,padding='same',activation='tanh'))#第六个卷积层
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(MaxPooling1D(2,strides=2,padding='same'))
model.add(Flatten())#将经过卷积和池化的数据展平,具体操作方式可以理解为,有n个通道的卷积输出,将每个通道压缩成一个数据,这样展评后就会出现n个数据
model.add(Dense(100))
model.add(Dense(2, activation='softmax',name='b'))#最后一层的参数设置要和标签种类一致,而且激活函数采取分类器softmax
print(model.summary())#模型小结,在训练时可以看到网络的结构参数
model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
#定义训练模型时的loss函数,acc函数,以及优化器,这个adam优化器不用导入,属于自适应优化器,这样我在一开始导入的SGD就没用了。
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=150,validation_data=(X_test, Y_test),batch_size=1024,callbacks=[tensorboard])
#训练批量大小和批次
#定义训练的正反向传播,epochs训练批次,batch_size每个批次的大小集每次有多少个数据参与训练,数字不能太大,也不能太小,为数据集的20%为宜
model_json =model.to_json()
with open('C:/Users/1/Desktop/model3', 'w')as json_file:
    json_file.write(model_json)# 权重不在json中,只保存网络结构
model.save_weights('C:/Users/1/Desktop/model3.json.h5')
#画出损失函数图
import matplotlib.pyplot as plt#这再次导入plt画图工具
plt.figure(figsize = (8, 6))
plt.rcParams['axes.unicode_minus'] = False
#plt.rcParams['font.sans-serif'] = ['SimSun']#这一行已经画不出东西了,留着吧
plt.rcParams['font.sans-serif'] = ['Times New Roman']
#plt.plot(history.history['loss'],'g--',label="Train_loss",  )#画出train_loss曲线
#plt.plot(history.history['val_loss'],'k:',label='Test_loss', )#画出val_loss曲线
#plt.plot(history.history['accuracy'],'b-.',label='Train_acc',  )#画出train_acc曲线
#plt.plot(history.history['val_accuracy'],'r-',label='Test_acc', )#画出val_acc曲线
plt.plot(history.history['loss'],label="Train_loss",  )#画出train_loss曲线
plt.plot(history.history['val_loss'],label='Test_loss', )#画出val_loss曲线
plt.plot(history.history['accuracy'],label='Train_acc',  )#画出train_acc曲线
plt.plot(history.history['val_accuracy'],label='Test_acc', )#画

plt.xlim(1,150)
#plt.legend(loc='upper left')
plt.rcParams.update({'font.size':20})
plt.legend()
plt.xlabel('Epochs ', fontsize=20) # x轴名称
plt.xticks(fontsize=20)#嗯调调字体
plt.yticks(fontsize=20)
plt.ylabel('Accuracy and Loss', fontsize=20) # y轴名称
plt.show()#显示画出的曲线图
los=history.history['val_loss']
Aos=history.history['val_accuracy']

我这个数据增强代码还需要升级改进,目前分两类用起来比较方便,如果类别较多的话还需要早来一个for循环,但这也好过一个一个制作CSV文件
TICNN的模型参数:
请添加图片描述
请添加图片描述

不得不说人家提出的神经网络模型真的很牛逼,按照这个计算感受视野属实优秀许多。
训练结果如下:请添加图片描述

请添加图片描述
离大谱
仔细观察,我的数据输入进来根本就没有进行归一化,但是训练起来几乎3步之内准确率已经达到1,Loss接近0,150次Loss可以达到10的-7次方级别。属实牛逼

  • 10
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

让我顺利毕业吧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值