数智资源网
首页 首页 人工智能 查看内容

神经网络理论基础及Python实现

木马童年 2018-9-18 21:20 776 0

一、多层前向神经网络 多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成; 输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任 ...

一、多层前向神经网络

多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;

输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;

除去输入层之外,隐藏层和输出层的层数和为n,则该神经网络称为n层神经网络,如下图为2层的神经网络;

一层中加权求和,根据非线性方程进行转化输出;理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程;

二、设计神经网络结构

使用神经网络之前,必须要确定神经网络的层数,以及每层单元的个数;

为了加速学习过程,特征向量在传入输入层前,通常需要标准化到0和1之间;

离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值

比如:特征值A可能去三个值(a0,a1,a2),那么可以使用3个输入单元来代表A

如果A=a0,则代表a0的单元值取1,其余取0;

如果A=a1,则代表a1的单元值取1,其余取0;

如果A=a2,则代表a2的单元值取1,其余取0;

神经网络既解决分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是两类,则可以用一个输出单元(0和1)分别表示两类;如果多余两类,则每一个类别用一个输出单元表示,所以输出层的单元数量通常等一类别的数量。

没有明确的规则来设计最佳个数的隐藏层,一般根据实验测试误差和准确率来改进实验。

三、交叉验证方法

如何计算准确率?最简单的方法是通过一组训练集和测试集,训练集通过训练得到模型,将测试集输入模型得到测试结果,将测试结果和测试集的真实标签进行比较,得到准确率。

机器学习领域一个常用的方法是交叉验证方法。一组数据不分成2份,可能分为10份,

第1次:第1份作为测试集,剩余9份作为训练集;

第2次:第2份作为测试集,剩余9份作为训练集;

……

这样经过10次训练,得到10组准确率,将这10组数据求平均值得到平均准确率的结果。这里10是特例。一般意义上将数据分为k份,称该算法为K-fold cross validation,即每一次选择k份中的一份作为测试集,剩余k-1份作为训练集,重复k次,最终得到平均准确率,是一种比较科学准确的方法。

四、BP算法

通过迭代来处理训练集中的实例;

对比经过神经网络后预测值与真实值之间的差;

反方向(从输出层=>隐藏层=>输入层)来最小化误差,来更新每个连接的权重;

4.1、算法详细介绍

输入:数据集、学习率、一个多层神经网络构架;

输出:一个训练好的神经网络;

初始化权重和偏向:随机初始化在-1到1之间(或者其他),每个单元有一个偏向;对于每一个训练实例X,执行以下步骤:

1、由输入层向前传送:

结合神经网络示意图进行分析:

由输入层到隐藏层:

由隐藏层到输出层:

将两个公式进行总结,可以得到:

Ij为当前层单元值,Oi为上一层的单元值,wij为两层之间,连接两个单元值的权重值,sitaj为每一层的偏向值。我们要对每一层的输出进行非线性的转换,示意图如下:

当前层输出为Ij,f为非线性转化函数,又称为激活函数,定义如下:

即每一层的输出为:

这样就可以通过输入值正向得到每一层的输出值。

2、根据误差反向传送 对于输出层:其中Tk是真实值,Ok是预测值

对于隐藏层:

权重更新:其中l为学习率

偏向更新:

3、终止条件

偏重的更新低于某个阈值;

预测的错误率低于某个阈值;

达到预设一定的循环次数;

4、非线性转化函数

上面提到的非线性转化函数f,一般情况下可以用两种函数:

(1)tanh(x)函数:

tanh(x)=sinh(x)/cosh(x)

sinh(x)=(exp(x)-exp(-x))/2

cosh(x)=(exp(x)+exp(-x))/2

(2)逻辑函数,本文上面用的就是逻辑函数

五、BP神经网络的python实现

需要先导入numpy模块

importnumpyasnp

定义非线性转化函数,由于还需要用到给函数的导数形式,因此一起定义

deftanh(x): returnnp.tanh(x)deftanh_deriv(x): return1.0-np.tanh(x)*np.tanh(x)deflogistic(x): return1/(1+np.exp(-x))deflogistic_derivative(x): returnlogistic(x)*(1-logistic(x))

设计BP神经网络的形式(几层,每层多少单元个数),用到了面向对象,主要是选择哪种非线性函数,以及初始化权重。layers是一个list,里面包含每一层的单元个数。

classNeuralNetwork: def__init__(self,layers,activation='tanh'):""" :paramlayers:Alistcontainingthenumberofunitsineachlayer. Shouldbeatleasttwovalues :paramactivation:Theactivationfunctiontobeused.Canbe "logistic"or"tanh" """ ifactivation=='logistic':self.activation=logisticself.activation_deriv=logistic_derivative elifactivation=='tanh':self.activation=tanhself.activation_deriv=tanh_derivself.weights=[]foriinrange(1,len(layers)-1):self.weights.append((2*np.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)self.weights.append((2*np.random.random((layers[i]+1,layers[i+1]))-1)*0.25)

实现算法

deffit(self,X,y,learning_rate=0.2,epochs=10000): X=np.atleast_2d(X) temp=np.ones([X.shape[0],X.shape[1]+1]) temp[:,0:-1]=X X=temp y=np.array(y)forkinrange(epochs): i=np.random.randint(X.shape[0]) a=[X[i]]forlinrange(len(self.weights)): a.append(self.activation(np.dot(a[l],self.weights[l]))) error=y[i]-a[-1] deltas=[error*self.activation_deriv(a[-1])]forlinrange(len(a)-2,0,-1): deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l])) deltas.reverse()foriinrange(len(self.weights)): layer=np.atleast_2d(a[i]) delta=np.atleast_2d(deltas[i])self.weights[i]+=learning_rate*layer.T.dot(delta)

实现预测

defpredict(self,x): x=np.array(x) temp=np.ones(x.shape[0]+1) temp[0:-1]=x a=tempforlinrange(0,len(self.weights)): a=self.activation(np.dot(a,self.weights[l]))returna

我们给出一组数进行预测,我们上面的程序文件保存名称为BP

fromBPimportNeuralNetworkimportnumpyasnp nn=NeuralNetwork([2,2,1],'tanh') x=np.array([[0,0],[0,1],[1,0],[1,1]]) y=np.array([1,0,0,1]) nn.fit(x,y,0.1,10000)foriin[[0,0],[0,1],[1,0],[1,1]]: print(i,nn.predict(i))

结果如下:

([0,0],array([0.99738862])) ([0,1],array([0.00091329])) ([1,0],array([0.00086846])) ([1,1],array([0.99751259]))

神经网络 机器学习 数据集
0
为您推荐
高等数学,学习算法人工智能大数据的第一步教程下载

高等数学,学习算法人工智能大数据的第一步

课程介绍:从最基础的函数与极限相关的知识,步步深入到微分学的领域,包括导数与微分…...

Python400集(第四季)【北京尚学堂·百战程序员】,资源教程下载

Python400集(第四季)【北京尚学堂·百战

课程名称Python400集(第四季)【北京尚学堂·百战程序员】课程目录1.算法2.数据结构3…...

花书+西瓜书+统计学习(完整版),资源教程下载

花书+西瓜书+统计学习(完整版),资源教程

课程名称花书+西瓜书+统计学习(完整版),资源教程下载课程介绍如果你从来没有使用过…...

最新Python黑马基础班+就业班,全套视频教程下载

最新Python黑马基础班+就业班,全套视频教

课程介绍本期黑马Python基础班+就业班课程为2018年录制,课程质量有保证,请大家放心…...

数字货币python量化投资课程,视频教程下载

数字货币python量化投资课程,视频教程下载

课程介绍:学习了解数字货币,对交易的标的有清醒的认知需要掌握基本的python编程基础…...

轻松入行人工智能-Python3入门机器学习 经典算法与应用,资源教程下载

轻松入行人工智能-Python3入门机器学习 经

课程简介:bobo老师特为机器学习初学者量身打造,使用新版python3语言和流行的scikit-…...

从入门到进阶,攻破人工智能CV领域的资源教程下载

从入门到进阶,攻破人工智能CV领域的资源教

课程介绍:以主流的语言python为主,简单易学,从零开始课程从python语法讲起,逐步学…...

贪心学院-CV计算机视觉集训营,视频教程下载

贪心学院-CV计算机视觉集训营,视频教程下

课程介绍:有机器学习基础,有较强的编程能力,对数据结构与算法比较熟悉之后想从事CV…...

最新评论(0)