【python实战】利用BP神经网络做传感器数据分类(数据处理+训练+调用步骤,科研神器)


前言

主要任务:
做科研项目,对传感器的一些数据分类,分成三类,正常,异常,紧急三类,分别以0,1,2来表示。
解决方法:
主要读取传感器三维的数据,每秒500个采样点,打算取200个采样点,每个采样点有三维的信息,作为(3,200)的输入进行监测。这里参考的是莫烦python里的classifier,建立简单的BP神经网络进行训练,预测,供大家学习,欢迎点赞关注收藏,一起进步。

一、数据获取

  1. 先做实验,获取足够的样本,然后对样本进行处理,保存为csv文件。
    我建立了3个文件夹,分别为0,1,2,保存三种的数据
  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.网络参数的一些选择,这个需要不断的尝试。


感谢阅读,如果对您有帮助,欢迎点赞,关注,收藏

  • 4
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种功能强大的编程语言,在预测数据方面,它提供了一套完整的工具集来实现神经网络,例如BP(Back-Propagation)神经网络BP神经网络是一种常用的人工神经网络模型,它可以通过训练数据来学习和预测结果。在Python中,我们可以使用一些流行的库如TensorFlow、Keras或PyTorch来构建和训练BP神经网络模型。 首先,我们需要准备用于训练和预测的数据集。数据集应包含输入特征和相应的目标值。然后,我们可以定义一个神经网络模型,并配置网络的层次结构,包括输入层、隐藏层和输出层。在隐藏层中,我们可以选择不同的激活函数,如Sigmoid、ReLU或Tanh,来引入非线性功能。 然后,我们可以使用训练数据训练模型。在每个训练期间,模型通过更新权重和偏差值来逐渐调整自身以更好地拟合训练数据。这个过程称为反向传播,它使用梯度下降算法来最小化预测结果和实际结果之间的误差。 完成模型训练后,我们可以使用该模型来预测新的数据。将新的输入数据传递到模型中,它会通过前向传播来计算输出结果。输出结果可以是实数、分类标签或多个值之一,具体取决于预测问题的特定需求。 通过Python提供的丰富的机器学习神经网络库,我们可以方便地实现BP神经网络进行数据预测。Python的简洁语法和丰富的第三方库支持使其成为进行神经网络预测的理想选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值