back propagation算法程序(python神经网络编程)

back propagation算法程序(python神经网络编程)

本文相关知识:

1、back propagation算法简介

2、神经网络在python中的实现

在人工智能领域,有一个方法叫机器学习。在机器学习这个方法里,有个分支叫做深度学习,深度学习的算法中,有一类算法叫神经网络

因为篇幅所限(我想偷懒),所以本篇就简要介绍一下神经网络以及反向传播算法

神经网路算法是一个上个世纪50年代末就已经提出了的算法,经历了初期训练困难、实用性差、电脑性能限制等等带来的递归,自1986年,Rumelhart、Hinton和Williams提出了多层前馈神经网络的学习算法,即BP算法之后,过了30年才真正大放异彩,在近些年引发了AI的大热。神经网路算法是通过计算机程序对生物的神经网络的非线性决策过程进行模拟,从而完成函数拟合到图片识别,棋类游戏,甚至提供公司的解决方案。

而BP算法不仅简单,而且实用性强,在前人的不断优化之下也在各个领域取得了卓越的成就。

全连通神经网络构成

一个全连通神经网络可以由上而下分为

网络—层—神经元及其连接

按照hinton老爷子的说法,每一个神经元都可以被视为一个感知器(如上图),它通过接收上一层的神经元传递而来的加权信号(上图中的权重就是各个w),经过非线性函数(例如上图中的sigmoid函数),输出自己的值。

形象地说,就像极了神经元接受上游神经元传来的刺激,如果刺激超过一定的阈值,这个神经元的反应就会迅速变强,刺激他的下游神经元

那么如何让这些神经元变得“聪明”呢?这就需要靠“学习”,这一学习的过程就被称为反向传播算法,这是一种典型的监督式学习算法,这一算法的流程大概如下:

1、给神经网络的输入层一个输入的数据,向着输出层逐层计算出各个神经元的输出值并传递给下一层,直至输出层。

2、将输出层输出的数据和预期其输出的正确数据做对比(可以是一个值,也可以一个向量),制定一个误差函数计算出误差(一般就是两点欧式距离的平方)。

3、从输出层开始,向着输入层逐层计算误差函数对各个节点之间的连接权重的偏导数,这样我们就知道往哪个方向调整这个权重误差函数下降得最快,并且以此为依据调整权重

特别地,求解偏导的过程实际上是一个递推的过程,对某两层间的连接权重的计算实际上可以用下游层的梯度的加权和求得(感性地说是这样的),因此给编程实现BP神经网络提供了很大便利。

(因為沒人想看公式推導我就不放了)

为什么我们需要神经网络

数据分析

(因为小编做了一个烦死人的实验)

(阻尼振动与受迫振动mdzz)

在上周三晚上,小编费劲心机测完了上百个数据点,回到宿舍终于开始数据处理,直到画受迫振动的幅频特性曲线的时候

隐隐感觉事情有那么一丝不对劲

(其实是好像数据点测少了……)

什么鬼嘛!

QWQ

Excel根本拟合不出来

它本来就是一个反正切套有理分式这种鬼函数

电脑又装满了下不了Matlab origin(qwq智障才会和我一样买128G的macbook)

怎么办。。

emmmm。。。

自己动手丰衣足食写个神经网络来拟合函数啊!

python才几十兆真诱人(X

还能顺便完成科协五分钟的锅(X

网络源代码

emmm我知道放了代码也没人看。。想看代码私♂聊。这个是数据,手打的,别问为啥,python没学到导入Excel 表。。

net类,集成了对网络初始化以及各种API

写了五个类,由上层到下层逐步建立起神经网络,node的biasnode是神经元,connection是神经元之间的连接,layer和connections分别是他们的集合,这是面对对象的程序设计在实践中的又一次大胜利,要不是能写类想一想就晕了……

顺带一提,此处使用了matplotlib库,这是一个贼棒的python可视化绘图工具,具体的库函数什么的大家就可以去百度一下就有,因为我的电脑没电了现在是用平板在赶推送qwq

设置训练次数,误差要求,层数,学习速率,层中神经元的数量,这些都是些手艺活,好像有什么经验公式来着。。

(其实在训练中还使用了随机梯度下降,动量优化,还有不知道管不管用的随机断开神经元之间的连接之类的骚操作,因为单纯的梯度下降真的 太 慢 了)

跑了大概十分钟吧……

给100个采样点

emmmmm 我觉得挺光滑的就是了……老师应该不会有意见的

(横轴还画错了

然后隔壁某疯人院的提出了不同意见

emmm…我们忽略砸场子的吧

问题:写了快五百行代码就只能干这事??

当然不是

我们还能做做手写数字识别啊

这时候就必须真正优化这个神经网络了

使用numpy中对矩阵计算的各种骚操作我们可以很清爽的在一百行代码左右的工作量下完成整个神经网络

我们使用传说中的MNIST数据集,也就是60000张28*28的带label的数字图

首先,我们需要把MNIST数据集处理为神经网络能够接受的形式。训练样本是一个28*28的图像,就用一个数组存一下就好啦

我们用一个十维的数组做标记向量,如果一张图片是6,我们就把第六个设为1,其他都是0(因为输出的函数的值域是0~1,后来仔细想想应该设0.1和0.9好一些啊),然后设置神经网络最后一层也是10个node

取好停止的条件,学习率,点开始,去睡觉(X

然后经过艰苦卓绝的梯度下降的满满长路,最终我们能够看到的其实也很有限:

神经网络对一张编号为5598的图片识别的结果是5

而他的label正好是label[5]=1

大概算是成功了吧再不成功我要砸电脑了

结语

因为条件所限(是因为ddl太多了学的太少了)没有对其进行更深层次的开发,然而神经网络算法之所以能大放异彩可不是因为能够在这些小地方玩一玩,python中的tensorflow,keras这些已经足够成熟,足够强大的库,可以在很短的时间内搭建一个比上面的网络性能强上百倍万倍的BP网络、卷积神经网络等等。Matlab中也集成了神经网络的框架,就算不能精通于此,了解一二也对掌握这个世界的潮流很有帮助的~

排版:林逸晗

审核:蒋施州

发表评论

登录后才能评论