您的位置:首页 > 理论基础 > 计算机网络

BP神经网络1(理论--鸳尾花分类Demo)

2018-01-24 16:05 260 查看
一 简介

    BP算法的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。

    正向传播时:输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出不符,则转入误差的反向传播阶段。

    反向传播时:误差反传是将输出误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。

    这种信号正向传播与误差反向传播的各层权值调整过程是周而复始地进行的,权值不断调整的过程,也就是网络的学习训练过程。此过程一直进行到网络输出的误差减少到可以接受的程度,或者进行到预先设定的学习次数为止。

二 BP神经网络模型

    采用BP算法的多层感知器是至今为止应用最广泛的神经网络,在多层感知器的应用中,以图一



所示的单隐层网络的应用最为普遍。一般习惯将单隐层感知器称为三层感知器,包含输入层、隐层、输出层。

转移函数为:图二



f(x)具有连续、可导的特点,如图三:



根据应用需要,也可以采用双极性Sigmoid函数(或称双曲线正切函数):如图



三 BP算法的过程与流程

    下面以三层感知器为例介绍BP学习算法,然后将所得结论推广到一般多层感知器的情况。

1 网络误差定义与权值调整思路

  当网络输出与期望输出不等时,存在输出误差E,定义如下:图五



将以上误差定义式展开至隐层,有:图六



进一步展开至输入层,有:图七



2
调整权值的原则是使误差不断的减小,因此应使权值的调整量与误差的梯度下降成正比,即:图八



式中的负号表示梯度下降。

3 BP算法的程序实现流程图,如下图:图九



四    BP神经网络的例子

1 鸳尾花数据集是一个很出名的数据集,可以通过sklearn库加载数据集,数据集中有4中花,每种花有4个属性,一共150条数据,我们这里取两种花,给两种花做分类

from sklearn.datasets import load_iris

dataSets = load_iris()

X = np.array(dataSets.data) #花的叶片数据

Y = np.array(dataSets.target) #花的种类数据

Y = Y.reshape(1, 150)

X = X[0 : 75, :] #一共150条数据四种花,取其中两种花的属性数据

Y = Y[:, 0 : 75] #只取两种花的分类

数据预处理:(为了输入层的偏置)

X1 = np.ones(X.shape[0])

X = np.insert(X, 0, values=X1, axis= 1) #把1插入到属性数据的第0列,为了后面的偏置值

2 代码与步骤

  输入层的神经元个数的确定:每种花四个属性,那么有4个神经元,每个神经元有个误差项,也叫偏置,多加一个偏置值的神经元,因为输入层神经元个数为5

  神经网络设置为3层的网络,因此隐层的取值矩阵为(5,3)的矩阵:

    V = np.random.random((5, 3))*2 - 1

  输出层神经元的确定:我们选择了两种花,输出层有两种类别,加上偏置,因此输出层有3个神经元,输出层的权值为(3, 1)

  W = np.random.random((3, 1))*2 - 1

  根据上面讲的,图二中的转移函数的公式,也称为激活函数有:

  def sigmoid(x):

        return 1/(1 + np.exp(-x))

  根据图三中,转移函数的可导性有:

    def dsigmoid(x):

          return x*(1-x)

  则:隐层与输出层权值的调整有:

  L2_delta = (Y.T - L2) * dsigmoid(L2)

  L1_delta = L2_delta.dot(W.T)* dsigmoid(L1)

  W_C = lr * L1.T.dot(L2_delta)

  V_C = lr * X.T.dot(L1_delta)

  W = W + W_C

  V = V + V_C

  我们设置计算10000次,每500次看一下调整的结果,期望输出与实际输出Y相比较,正确的百分比,完整的代码地址:例子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息