十一、机器学习进阶知识:反向传播神经网络(BPNN)的实现(Python,附源码及数据集) 您所在的位置:网站首页 python预测算法代码 十一、机器学习进阶知识:反向传播神经网络(BPNN)的实现(Python,附源码及数据集)

十一、机器学习进阶知识:反向传播神经网络(BPNN)的实现(Python,附源码及数据集)

2024-01-27 00:01| 来源: 网络整理| 查看: 265

文章目录 一、理论基础 1、前向传播 2、反向传播 3、激活函数 4、神经网络结构 二、BP神经网络的实现 1、训练过程(BPNN.py) 2、测试过程(test.py) 3、测试结果 4、参考源码及实验数据集

一、理论基础

反向传播神经网络(BPNN)是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,最常见结构为3层。 数据在神经网络中的训练过程可分为前向传播过程与反向传播过程。通过前向传递过程将数据输入网络,数据依次通过隐含层与输出层并进行相关计算,得到输出值与目标值之间的误差;然后在反向进行传递过程进行神经网络权值、阈值的调整,重复此过程,使得神经网络的输出结果不断逼近真实值。 常见的BP神经网络为3层,输入层、隐含层、输出层。其中输入层传入数据,然后在隐含层与输出层分别与权值、阈值进行计算、从而实现非线性变换,最后在输出层与目标值进行比较获取误差。

1、前向传播

前向传播过程中隐含层与输出层的输出公式及误差公式计算如下: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

其中W与b为隐含层与输出层的权值和阈值,通过初始化生成,x为隐含层与输出层的输入数据,g为激活函数,h为输出,E为误差,y_i为目标值,y ̂_i为实际值。 参数初始化方法参考: 神经网络基础知识之参数初始化

2、反向传播

反向传播过程中输出层的误差项计算公式如下: 在这里插入图片描述 在这里插入图片描述

其中V与b_2为输出层的权值和阈值,E为损失函数。隐含层的误差项的计算公式可以此类推进行计算。 隐含层与输出层的权值和阈值的更新计算公式如下: 在这里插入图片描述 在这里插入图片描述 损失函数原理参考: 机器学习基础知识之损失函数 反向传播原理参考: 神经网络之反向传播算法(梯度、误差反向传播算法BP)

3、激活函数

在前向传播过程中,输入数据除了和隐含层、输出层的权值、阈值进行计算外,还会使用激活函数g对计算结果进行非线性计算。激活函数作为人工神经网络中神经元的核心,其作用在于将非线性因素引入神经元,它在输入传递至输出的过程中进行函数转换,以此将无限范围内的输入非线性变换为有限范围内的输出,一旦人工神经网络缺少激活函数,那么它每一层的数据传递过程就变成了单纯的矩阵计算过程,无论数据传递了多少层,最后的输出都是输入的线性组合。 常见的激活函数如下: 1、sigmod Sigmod函数是一种常见的S型函数,它能够将输入变量映射到0到1之间,其公式如下: 在这里插入图片描述

2、Tanh Tanh函数是一种双曲正切函数,它是由双曲正弦函数与双曲余弦函数推导而来,同样将输入处理成0到1之间,与sigmod不同的是它的输出是零中心的,其公式如下: 在这里插入图片描述

3、Relu Relu函数将输入和零进行比较,输出较大值,其公式如下: 在这里插入图片描述

4、Leaky Relu Leaky Relu函数和Relu函数不同的是,当输入小于零时,将输入与常量gamma进行计算作为输出,其公式如下: 在这里插入图片描述 激活函数对比及适用场景参考: 神经网络基础知识之激活函数

4、神经网络结构

BP神经网络的输入层和输出层层数通常需要根据实际问题进行确定,而隐含层的层数即节点数的确定,通常没有一个确定的方法,一般通过设置不同的节点数然后比较其网络训练结果来选择最优数量,而节点数的范围可通过以下公式进行确定: 在这里插入图片描述 在这里插入图片描述

其中h为隐含层单元数,n为输入层单元数,m为输出层单元数,a为1到10之间的常数。

二、BP神经网络的实现

以数据预测为例,下面介绍BP神经网络的实现过程。 选用某省市的表层土壤重金属元素数据集作为实验数据,该数据集总共96组,随机选择其中的24组作为测试数据集,72组作为训练数据集。选取重金属Ti的含量作为待预测的输出特征,选取重金属Co、Cr、Mg、Pb作为模型的输入特征。

1、训练过程(BPNN.py) #库的导入 import numpy as np import pandas as pd #激活函数tanh def tanh(x): return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x)) #激活函数偏导数 def de_tanh(x): return (1-x**2) #输入数据的导入 df = pd.read_csv("train.csv") df.columns = ["Co", "Cr", "Mg", "Pb", "Ti"] Co = df["Co"] Co = np.array(Co) Cr = df["Cr"] Cr = np.array(Cr) Mg=df["Mg"] Mg=np.array(Mg) Pb = df["Pb"] Pb =np.array(Pb) Ti = df["Ti"] Ti = np.array(Ti) samplein = np.mat([Co,Cr,Mg,Pb]) #数据归一化,将输入数据压缩至0到1之间,便于计算,后续通过反归一化恢复原始值 sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0],samplein.max(axis=1).T.tolist()[0]]).transpose() sampleout = np.mat([Ti]) sampleoutminmax = np.array([sampleout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有