欢迎来到天天文库
浏览记录
ID:27464248
大小:862.50 KB
页数:19页
时间:2018-12-04
《BP神经网络算法 python实现.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、BP神经网络算法python实现 直接上代码是最有效的学习方式。这篇教程通过由一段简短的python代码实现的非常简单的实例来讲解BP反向传播算法。 当然,上述程序可能过于简练了。下面我会将其简要分解成几个部分进行探讨。 第一部分:一个简洁的神经网络 一个用BP算法训练的神经网络尝试着用输入去预测输出。 考虑以上情形:给定三列输入,试着去预测对应的一列输出。我们可以通过简单测量输入与输出值的数据来解决这一问题。这样一来,我们可以发现最左边的一列输入值和输出值是完美匹配/完全相关的。直观
2、意义上来讲,反向传播算法便是通过这种方式来衡量数据间统计关系进而得到模型的。下面直入正题,动手实践。 2层神经网络: OutputAfterTraining: [[0.00966449] [0.00786506] [0.99358898] [0.99211957]] 变量定义说明 X输入数据集,形式为矩阵,每1行代表1个训练样本。 y输出数据集,形式为矩阵,每1行代表1个训练样本。 l0网络第1层,即网络输入层。 l1网络第2层,常称作隐藏层。 Syn第一层权值,突触0,连接
3、l0层与l1层。 0 *逐元素相乘,故两等长向量相乘等同于其对等元素分别相乘,结果为同等长度的向量。 –元素相减,故两等长向量相减等同于其对等元素分别相减,结果为同等长度的向量。 x.dot(y)若x和y为向量,则进行点积操作;若均为矩阵,则进行矩阵相乘操作;若其中之一为矩阵,则进行向量与矩阵相乘操作。 正如在“训练后结果输出”中看到的,程序正确执行!在描述具体过程之前,我建议读者事先去尝试理解并运行下代码,对算法程序的工作方式有一个直观的感受。最好能够在ipythonnotebook中原封不
4、动地跑通以上程序(或者你想自己写个脚本也行,但我还是强烈推荐notebook)。下面是对理解程序有帮助的几个关键地方: ·对比l1层在首次迭代和最后一次迭代时的状态。 ·仔细察看“nonlin”函数,正是它将一个概率值作为输出提供给我们。 ·仔细观察在迭代过程中,l1_error是如何变化的。 ·将第36行中的表达式拆开来分析,大部分秘密武器就在这里面。 ·仔细理解第39行代码,网络中所有操作都是在为这步运算做准备。 下面,让我们一行一行地把代码过一遍。 建议:用两个屏幕来打开这篇博客,这
5、样你就能对照着代码来阅读文章。在博客撰写时,我也正是这么做的。 第1行:这里导入一个名叫numpy的线性代数工具库,它是本程序中唯一的外部依赖。 第4行:这里是我们的“非线性”部分。虽然它可以是许多种函数,但在这里,使用的非线性映射为一个称作“sigmoid”的函数。Sigmoid函数可以将任何值都映射到一个位于0到1范围内的值。通过它,我们可以将实数转化为概率值。对于神经网络的训练,Sigmoid函数也有其它几个非常不错的特性。 第5行:注意,通过“nonlin”函数体还能得到sigmod函
6、数的导数(当形参deriv为True时)。Sigmoid函数优异特性之一,在于只用它的输出值便可以得到其导数值。若Sigmoid的输出值用变量out表示,则其导数值可简单通过式子out*(1-out)得到,这是非常高效的。 若你对求导还不太熟悉,那么你可以这样理解:导数就是sigmod函数曲线在给定点上的斜率(如上图所示,曲线上不同的点对应的斜率不同)。有关更多导数方面的知识,可以参考可汗学院的导数求解教程。 第10行:这行代码将我们的输入数据集初始化为numpy中的矩阵。每一行为一个“训练实例”,
7、每一列的对应着一个输入节点。这样,我们的神经网络便有3个输入节点,4个训练实例。 第16行:这行代码对输出数据集进行初始化。在本例中,为了节省空间,我以水平格式(1行4列)定义生成了数据集。“.T”为转置函数。经转置后,该y矩阵便包含4行1列。同我们的输入一致,每一行是一个训练实例,而每一列(仅有一列)对应一个输出节点。因此,我们的网络含有3个输入,1个输出。 第20行:为你的随机数设定产生种子是一个良好的习惯。这样一来,你得到的权重初始化集仍是随机分布的,但每次开始训练时,得到的权重初始集分布都是
8、完全一致的。这便于观察你的策略变动是如何影响网络训练的。 第23行:这行代码实现了该神经网络权重矩阵的初始化操作。用“syn0”来代指“零号突触”(即“输入层-第一层隐层”间权重矩阵)。由于我们的神经网络只有2层(输入层与输出层),因此只需要一个权重矩阵来连接它们。权重矩阵维度为(3,1),是因为神经网络有3个输入和1个输出。换种方式来讲,也就是l0层大小为3,l1层大小为1。因此,要想将l0层的每个神经元节点与l1层的每个神经元节点相连
此文档下载收益归作者所有