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

发表于:2017-3-15 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:温梦月    来源:51Testing软件测试网采编

#
Python
分享:
  神经网络既解决分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是两类,则可以用一个输出单元(0和1)分别表示两类;如果多余两类,则每一个类别用一个输出单元表示,所以输出层的单元数量通常等一类别的数量。
  一、多层前向神经网络
  多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;
  输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;
  除去输入层之外,隐藏层和输出层的层数和为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为非线性转化函数,又称为激活函数,定义如下:
  即每一层的输出为:
  这样就可以通过输入值正向得到每一层的输出值。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号