基于BP神经网络的交通安全预警模型及代码实例

文章目录

  • 前言
  • 一、BP神经网络是什么?
  • 二、模型构建
    • 1.模型输入输出指标的选取
    • 2.模型结构设计
    • 3.层数的确定
    • 4.各层神经元个数的确定
    • 5.激活函数及输出层的确定
    • 6.初始权重值、学习速率的确定
  • 三 代码构成及原始数据
    • 训练结果
  • 总结


前言

本人小白,本博客仅用作本人学习记录使用,欢迎大家学习交流,如有不对欢迎大家指正。
本人的毕业设计当中,有一部分需要构建交通危险预警模型,考虑到最近神经网络性能的优越性和普适性,本人决定使用BP神经网络构建神经网络预警模型。


一、BP神经网络是什么?

    BP网络可以说是一种多层向前的网络,主要有输入层、隐含层和输出层,隐含层在输入层和输出层之间,可能是一层也可能是多层隐含单元。其釆用的算法是误差反向传播,通过有教师学习的方式进行网络学习。如图所示,是一个三层的BP网络,即该网络只含有一个隐含层网络中相邻层之间的神经元全部实现相互连接,但同一层的神经元间没有相互连接。BP算法的核心思想就是在设计算法时,给定用来作为网络学习依据的输入数据和期望输出,然后逐层向前计算得到网络的实际输出。进而将实际输出与期望输出进行相互比较,如果网络的实际输出和给定的期望输出之间出现了偏差,就把这个偏差沿着网络的反方向传播,也就是让偏差从网络的输出层逐步反向传播,并且逐层修改连接权重,一直到输出的结果满足偏差要求为止。实际应用表明三层BP神经网络具有极其强大的映射能力.

基于BP神经网络的交通安全预警模型及代码实例_第1张图片

二、模型构建

BP神经网络的构建主要包括三个步骤,分别是模型输入输出指标的选取、模型结构涉及、模型训练:

1.模型输入输出指标的选取

交通系统是一个由人-车-路-环境所构成的复杂系统,该复杂系统中众多因素都能够对于交通事故的发生与否产生较为重大的影响。但是,由于系统中存在众多难以进行量化的指标,且部分指标对于交通安全水平及交通事故的影响水平相对较小。通过对于高速公路交通安全影响因素的分析和研究,本文选择将驾驶员违规率、道路线形不良路段比例、设施完善度、天气情况、年平均日交通量、大型车比例、年平均事故数、路段限速值、施工区道路占比等九个变量作为模型的输入,模型的输出则为目标高速公路路段的危险等级。

2.模型结构设计

3.层数的确定

神经网络的层数是神经网络的一个重要参数,层数的多少会对网络的性能以及误差大小产生一定的影响。如果网络层数不够,会使得网络的误差过大,如果层数过多,不仅会使得模型结构过于复杂,难以解释,而且会降低模型的泛化能力,出现过拟合的现象。通常情况下,三层神经网络已经具备拟合复杂函数的能力,具有较高的准确性且模型不会过于复杂,因此,本文也采用三层BP神经网络模型。

4.各层神经元个数的确定

a) 输入层与输出层神经元的个数
本系统所构建的基于BP神经网络的危险预警模型中,由信息采集子系统所采集的数据首先输入神经网络的输入层中,然后由输入层进入隐藏层中,最后由隐藏层进入输出层,得出最后的预测结果。输入层和输出层是神经网络中最重要的两个参数,其个数由输入数据的维度和输出数据的维度所决定。本文中,采用的各类评价指标共9个,所以输入层神经元的个数为9,本文中输出的安全等级共计三类,所以输出层神经元的个数为3。
b) 隐藏层神经元的个数
隐藏层神经元的个数同样是BP神经网络一个较为重要的参数,因为隐藏层神经元个数过多或过少都会影响最后的安全评级结果。如果神经元过少,网络对于输入数据的敏感程度不高,导致过于偏重某些数据,影响安全评级的客观性,如果神经元个数过多,不仅增加了训练过程中的计算量,而且容易引起过拟合现象。通常来说,确定隐藏层神经元个数的方法有以下几种:
a) ​​
在这里插入图片描述

b)
在这里插入图片描述

c)
在这里插入图片描述

式中:
K代表隐藏层神经元个数
m表示输入层神经元个数
n表示输出层神经元个数
a为调整系数,a∈[1,10]

5.激活函数及输出层的确定

神经网络中常见的激活函数包括sigmoid函数、tanh函数、RELU函数、Leaky ReLU函数。由于sigmoid其函数平滑且易于求导的特性,被广泛应用于BP神经网络当中,因此本预警模型中所使用的BP神经网络的激活函数使用sigmoid函数,sigmoid函数的具体内容如下。
在这里插入图片描述

本系统中BP神经网络所输出的结果是对应路段的安全等级,这样一种使用方法可以归类为分类问题,而分类问题输出层常用的函数即softmax函数,因此本BP网络使用softmax作为输出层。
在这里插入图片描述

式中:
是第k个神经元的输出
是输出层神经元的输入

6.初始权重值、学习速率的确定

权重值是神经网络中重要的参数,神经网络能够在众多领域发挥重要作用,这与神经网络中各个节点的权重值的作用密不可分。并且初试权重值的大小会对最终的训练结果产生重要的影响,通常情况下,初试权重值的大小在±0.5左右。
学习速率同样是神经网络构建过程中的一个重要参数,学习率的大小将直接影响到算法的性能和结果,如果学习速率过小,训练过程中收敛的速度会减慢,并且可能陷入局部最优。如果训练速率过大,算法可能不稳定,无法求得最优解,影响神经网络的性能。本文中,学习速率采用经验值0.01
最终构成的模型整体如下所示
基于BP神经网络的交通安全预警模型及代码实例_第2张图片

三 代码构成及原始数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import preprocessing
from sklearn.model_selection import train_test_split #训练集,测试集划分函数
import torch
import torch.nn.functional as Fun
import pandas as pd
from math import sqrt
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score



data_gra = pd.read_csv("data_gra.csv")

data_ = data_gra.iloc[:,:9]
data_target = data_gra.iloc[:,9:]

lr=0.01 #学习率
epochs=700 #训练轮数
n_feature=9 #输入特征
n_hidden=6 #隐层节点数
n_output=3 #输出(三种对应的安全等级)

class BPNetModel(torch.nn.Module):
    def __init__(self,n_feature,n_hidden,n_output):
        super(BPNetModel, self).__init__()
        self.hiddden=torch.nn.Linear(n_feature,n_hidden)#定义隐层网络
        self.out=torch.nn.Linear(n_hidden,n_output)#定义输出层网络
    def forward(self,x):
        x=Fun.sigmoid(self.hiddden(x)) #隐层激活函数采用sigmoid()函数
        out=Fun.softmax(self.out(x),dim=1) #输出层采用softmax函数
        return out
#3.定义优化器和损失函数
net=BPNetModel(n_feature=n_feature,n_hidden=n_hidden,n_output=n_output) #调用网络
optimizer=torch.optim.Adam(net.parameters(),lr=lr) #使用Adam优化器,并设置学习率
loss_fun=torch.nn.CrossEntropyLoss() #对于多分类一般使用交叉熵损失函数

MSE_loss = torch.nn.MSELoss()

x_train0,x_test0,y_train,y_test=train_test_split(data_,data_target,test_size=0.2,random_state=22)#划分训练集和测试集
min_max_scaler = preprocessing.MinMaxScaler()
x_train = min_max_scaler.fit_transform(x_train0)
x_test = min_max_scaler.fit_transform(x_test0)

y_train=y_train.values
y_train = y_train.reshape(80,)#更改标签结构
y_test = y_test.values
y_test = y_test.reshape(20,)


x_train=torch.FloatTensor(x_train)#更改为pytorch需要使用的tensor类型
y_train=torch.LongTensor(y_train)
x_test=torch.FloatTensor(x_test)
y_test=torch.LongTensor(y_test)

loss_steps=np.zeros(epochs) #构造一个array([ 0., 0., 0., 0., 0.])里面有epochs个0
accuracy_steps=np.zeros(epochs)

for epoch in range(epochs):
    y_pred=net(x_train) #前向传播
    loss=loss_fun(y_pred,y_train)#预测值和真实值对比
   # MSE = MSE_loss(y_pred,y_train)
    optimizer.zero_grad() #梯度清零
    loss.backward() #反向传播
    optimizer.step() #更新梯度
    loss_steps[epoch]=loss.item()#保存loss
    running_loss = loss.item()
    print(f"第{epoch}次训练,loss={running_loss}".format(epoch,running_loss))
    with torch.no_grad(): #下面是没有梯度的计算,主要是测试集使用,不需要再计算梯度了
        y_pred=net(x_test)
        correct=(torch.argmax(y_pred,dim=1)==y_test).type(torch.FloatTensor)
        accuracy_steps[epoch]=correct.mean()
        print("安全等级的准确率", accuracy_steps[epoch])
        






fig_name="safety_dataset_classify_BPNet"
fontsize=15
fig,(ax1,ax2)=plt.subplots(2,figsize=(15,12),sharex=True)
ax1.plot(accuracy_steps)
ax1.set_ylabel("test accuracy",fontsize=fontsize)
ax1.set_title(fig_name,fontsize="xx-large")
ax2.plot(loss_steps)
ax2.set_ylabel("train lss",fontsize=fontsize)
ax2.set_xlabel("epochs",fontsize=fontsize)
plt.tight_layout()

部分原始数据如下所示:
基于BP神经网络的交通安全预警模型及代码实例_第3张图片

训练结果

整体正确率能够达到约95%,效果良好
基于BP神经网络的交通安全预警模型及代码实例_第4张图片

基于BP神经网络的交通安全预警模型及代码实例_第5张图片

总结

本文对本人毕设中使用到的基于BP神经网络的危险预警模型及代码构成进行了简单的介绍,并给出了最后的算法结果。如有不对之处,欢迎大家交流讨论。

你可能感兴趣的:(神经网络,网络,人工智能)