前言
主要任务:
做科研项目,对传感器的一些数据分类,分成三类,正常,异常,紧急三类,分别以0,1,2来表示。
解决方法:
主要读取传感器三维的数据,每秒500个采样点,打算取200个采样点,每个采样点有三维的信息,作为(3,200)的输入进行监测。这里参考的是莫烦python里的classifier,建立简单的BP神经网络进行训练,预测,供大家学习,欢迎点赞关注收藏,一起进步。
一、数据获取
- 先做实验,获取足够的样本,然后对样本进行处理,保存为csv文件。
我建立了3个文件夹,分别为0,1,2,保存三种的数据 - 对每个样本,自己进行分类,然后保存在数组里,再保存在相应文件夹里。这里给出读取csv的代码,以及保存为对对应状态文件的代码
#打开filename(所存数据的csv文件夹),从startime这个点开始读200个数据,存到y中,根据saveflag(对应的分类)保存到对应文件夹
#对应返回值: True表示成功 False 表示失败
def makedata(filename,starttime,saveflag):
y_x = []
y_y = []
y_z = []
data_count=0
with open(filename, "r") as f:
reader = csv.reader(f)
for row in reader:
line_num=reader.line_num
if line_num>=starttime:
forces = row[4].strip('[]').split(",")
y_x.append(float(forces[0]))
y_y.append(float(forces[1]))
y_z.append(float(forces[2]))
data_count+=1
if line_num>=starttime+200:
break
if(data_count!=200):
print(filename,starttime,"error! count is:",data_count)
return False
#拼接
y=np.vstack((y_x,y_y,y_z))
print(np.shape(y))
#设置savename
if saveflag==0:
savename ="0/"+len(os.listdir("0")).__str__()+'.csv'
elif saveflag==1:
savename = "1/"+len(os.listdir("1")).__str__()+'.csv'
else:
savename = "2/"+len(os.listdir("2")).__str__()+'.csv'
#保存
np.savetxt(savename, y, delimiter=',',fmt='%.15f')
return True
二、数据输入预处理
我是观察数据最大值不超过50,所以如果有超过50的数,直接报错,而且把负数变成正的,为后面转换做准备。
代码如下(示例):
import os
import numpy as np
def mydata():
x=[]
y=[]
for type in range(0,3,1):
#文件夹名字
filenamePre=type.__str__()
#不存在文件夹则返回错误
if (not os.path.exists(filenamePre)):
print("not exist:", filenamePre)
return False
filenums= len(os.listdir(filenamePre))
for i in range(0,filenums,1):
filename= filenamePre+'/'+i.__str__()+'.csv'
data = np.loadtxt(filename,delimiter=',')
for d1 in range(0,len(data),1):
for d2 in range(0,len(data[d1]),1):
#对数据进行处理,负数变正,>50的也不要,为后面均一化做准备。
if(abs(data[d1][d2])>50):
print("error >50")
return
#转化为正的
data=np.array(data)
data=abs(data)
# 添加进x,y
x.append(data)
y.append(type)
#转array方便后面用numpy处理
x=np.array(x)
y=np.array(y)
from sklearn.model_selection import train_test_split
# 划分训练集,test_size表示20%用来测试,random_state是随机次数吧
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=10)
return x_train, x_test, y_train, y_test
三、进行训练,保存
引入数据,建立网络,训练,保存
代码如下(示例):
import numpy as np
np.random.seed(1337) # for reproducibility
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
from data import mydata
#训练
def train():
#引入数据
X_train, X_test, y_train, y_test=mydata()
X_train = X_train.reshape(X_train.shape[0], -1) /50. # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 50. # normalize
y_train = np_utils.to_categorical(y_train, num_classes=3)
y_test = np_utils.to_categorical(y_test, num_classes=3)
#建立网络,input_dim 表示输入的数据的维度 我是200*3
model = Sequential([
Dense(32, input_dim=600),
Activation('relu'),
Dense(3),
Activation('softmax'),
])
#
# 定义 optimizer
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
# We add metrics to get more results you want to see
model.compile(optimizer=rmsprop,
loss='categorical_crossentropy',
metrics=['accuracy'])
print('Training ------------')
# Another way to train the model 训练epochs轮,每轮训练32个
model.fit(X_train, y_train, epochs=300, batch_size=32)
print('\nTesting ------------')
# Evaluate the model with the metrics we defined earlier
loss, accuracy = model.evaluate(X_test, y_test)
print('test loss: ', loss)
print('test accuracy: ', accuracy)
#保存权重
model.save('test_best_weights.h5')
四、调用模型,进行预测
可以调用保存的权重,进行预测,这里的输入是处理后的np.array数据。
def predict(input):
#加载模型
model = ClassifierNetwork()
model.load_weights('test_best_weights.h5')
# 输入数据预处理,必须处理到跟模型的输入一致,这里的输入得是np.array类型,如果是list类型还得用 np.array()函数转一下
input=abs(input)
input=input/255
# 获取结果
results = model.predict(input)#获得预测的三种状态的概率 以[x,y,z]表示
label_index = np.argmax(results, axis=0)#获得结果索引,索引默认从0开始
#返回索引结果
return label_index
总结
介绍了简单的用BP神经网络处理传感器数据并预测的步骤,过程,做工科科研非常有用。如有错误,欢迎各位大佬评论指正。
准确率不高的话需要从以下方向进行调优:
1.数据集采集的准确性,数据集样本要充足!(这是最重要的)
2.网络的选择,比如CNN适合做图像,RNN适合有时序信息的数据
3.网络参数的一些选择,这个需要不断的尝试。
感谢阅读,如果对您有帮助,欢迎点赞,关注,收藏!