精华内容
下载资源
问答
  • 神经网络分类

    万次阅读 2017-09-19 15:37:27
    人工神经网络(Artificial Neural Network,ANN)简称神经网络(NN),是基于生物学中神经网络的基本原理,在理解和抽象了人脑结构和外界刺激响应机制后,以网络拓扑知识为理论基础,模拟人脑的神经系统对复杂信息的...

    人工神经网络(Artificial Neural Network,ANN)简称神经网络(NN),是基于生物学中神经网络的基本原理,在理解和抽象了人脑结构和外界刺激响应机制后,以网络拓扑知识为理论基础,模拟人脑的神经系统对复杂信息的处理机制的一种数学模型。

    一、神经网络的发展

    1. 第一阶段-启蒙
      (1)M-P神经网络模型:40年代,美国心理学家麦克洛奇(Mcculloch)和数学家皮兹(Pitts)提出了M-P模型。这种“阈值加权和”的神经元模型称为M-P模型 ( McCulloch-Pitts Model ),也称为神经网络的一个处理单元( PE, Processing Element )。此时并没有引入激活函数。
      这里写图片描述
      (2)Hebb规则(无监督学习规则):1949 年,心理学家赫布(Hebb)出版了《The Organization of Behavior》(行为组织学),他在书中提出了突触连接强度可变的假设。可变性是学习和记忆的基础 这里写图片描述
      (3)Delta学习规则(有监督学习规则):这里写图片描述
      (4)感知器模型:1957 年,罗森勃拉特(Rosenblatt)以M-P 模型为基础,提出了感知器(Perceptron)模型,激活函数实际为阶跃函数。即为单层的人工神经网络,以区别于较复杂的多层感知机(Multilayer Perceptron)。一个一个样本进行调节。
      这里写图片描述
      (5)自适应线性神经网络(Adaline):自适应线性神经网络(Adaptive Linear,简称Adaline) 是由威德罗(Widrow)和霍夫(Hoff)首先提出的。它与感知器的主要不同之处在于 其神经元有一个线性激活函数,这允许输出可以是任意值,而不仅仅只是像感知器中那样只能取0或1。它采用的是Widrow-Hoff学习法则(又称最小均方差算法LMS或称δ规则),对权值进行训练。自适应线性元件的主要用途是线性逼近一个函数式而进行模式联想。其结构和感知机一样,仍然是单层。仍然不能解决线性不可分问题,但是学习规则相对于感知机进行了改进。多样本进行调节,批处理?
      这里写图片描述
      采用W-H规则训练自适应性元件使其能够收敛的必要条件是被训练的输入矢量必须是线性独立的(思考:如果线性相关产生什么样的结果),且必须选择合适的学习速率以免产生振荡现象。
      感知器和自适应线性神经网络对比
      这里写图片描述
      线性神经网络与感知器的区别在于:线性神经网络的神经元传递函数是线性函数,因此线性神经网络的输出可以取任意值,而感知器的输出只可能是0或者1。
      这里写图片描述
      线性神经网络在收敛速度与精度上都比感知器要高,但是同感知器一样,线性神经网络只能解决线性分离问题。
    2. 第二阶段—-低潮
      人工智能的创始人之一Minsky和Papert对以感知器为代表的网络系统的功能及局限性从数学上做了深入研究,于1969年发表了轰动一时《Perceptrons》一书,指出简单的线性感知器的功能是有限的,它无法解决线性不可分的两类样本的分类问题,如简单的线性感知器不可能实现“异或”的逻辑关系等。
      (1)自组织神经网络SOM模型(自组织神经网络和 K-means 聚类算法的比较分析http://blog.csdn.net/lg1259156776/article/details/47780695
      http://blog.csdn.net/u010540396/article/details/52733380):1972年,芬兰的KohonenT.教授,提出了自组织神经网络SOM(Self-Organizing feature map)。后来的神经网络主要是根据KohonenT.的工作来实现的。SOM网络是一类无监督学习网络,主要用于模式识别﹑语音识别及分类问题。自组织神经网络,是一种用于聚类的神经网络算法,从名字便可以看出,这是一种无监督式的算法,意味着,它不需要任何训练样本,便可以直接对输入样本根据其特征 分类,将具有相似特征的划分为一类。SOM是一类“无监督学习”模型,一般的用法是将高维的input数据在低维的空间表示[1],因此SOM天然是一种降维方法。除了降维,SOM还可以用于数据可视化,以及聚类等应用中。这里写图片描述
      (2)自适应共振理论ART:1976年,美国Grossberg教授提出了著名的自适应共振理论ART(Adaptive Resonance Theory),其学习过程具有自组织和自稳定的特征。
    3. 第三阶段—-复兴时期
      (1) Hopfield模型:1982年,美国物理学家霍普菲尔德(Hopfield)提出了一种离散神经网络,即离散Hopfield网络,从而有力地推动了神经网络的研究。在网络中,它首次将李雅普诺夫(Lyapunov)函数引入其中,后来的研究学者也将Lyapunov函数称为能量函数。证明了网络的稳定性。1984年,Hopfield 又提出了一种连续神经网络,将网络中神经元的激活函数由离散型改为连续型。1985 年,Hopfield和Tank利用Hopfield神经网络解决了著名的旅行推销商问题(Travelling Salesman Problem)。Hopfield神经网络是一组非线性微分方程。
      (2)Boltzmann机模型:1983年,Kirkpatrick等人认识到模拟退火算法可用于NP完全组合优化问题的求解,这种模拟高温物体退火过程来找寻全局最优解的方法最早由Metropli等人1953年提出的。1984年,Hinton与年轻学者Sejnowski等合作提出了大规模并行网络学习机,并明确提出隐单元的概念,这种学习机后来被称为Boltzmann机。
      Hinton和Sejnowsky利用统计物理学的感念和方法,首次提出的多层网络的学习算法,称为Boltzmann 机模型。
      (3)BP神经网络模型:1986年,儒默哈特(D.E.Ru melhart)等人在多层神经网络模型的基础上,提出了多层神经网络权值修正的反向传播学习算法—-BP算法(Error Back-Propagation),解决了多层前向神经网络的学习问题,证明了多层神经网络具有很强的学习能力,它可以完成许多学习任务,解决许多实际问题。
      (4)并行分布处理理论
      (5)细胞神经网络模型:1988年,Chua和Yang提出了细胞神经网络(CNN)模型,它是一个细胞自动机特性的大规模非线性计算机仿真系统。Kosko建立了双向联想存储模型(BAM),它具有非监督学习能力。
      按性能分:连续性神经网络和离散型神经网络
      (6)Darwinism模型:Edelman提出的Darwinism模型在90年代初产生了很大的影响,他建立了一种神经网络系统理论
      (7)1988年,Linsker对感知机网络提出了新的自组织理论,并在Shanon信息论的基础上形成了最大互信息理论,从而点燃了基于NN的信息应用理论的光芒。
      (8)1988年,Broomhead和Lowe用径向基函数(Radialbasis function, RBF)提出分层网络的设计方法,从而将NN的设计与数值分析和线性适应滤波相挂钩。
      (9)1991年,Haken把协同引入神经网络,在他的理论框架中,他认为,认知过程是自发的,并断言模式识别过程即是模式形成过程。
      (10)1994年,廖晓昕关于细胞神经网络的数学理论与基础的提出,带来了这个领域新的进展。通过拓广神经网络的激活函数类,给出了更一般的时滞细胞神经网络(DCNN)、Hopfield神经网络(HNN)、双向联想记忆网络(BAM)模型。
      (11)90年代初,Vapnik等提出了支持向量机(Supportvector machines, SVM)和VC(Vapnik-Chervonenkis)维数的概念。
    4. 第四阶段—-高潮时期
      深度学习(Deep Learning,DL)由Hinton等人于2006年提出,是机器学习(Machine Learning, ML)的一个新领域。深度学习本质上是构建含有多隐层的机器学习架构模型,通过大规模数据进行训练,得到大量更具代表性的特征信息。深度学习算法打破了传统神经网络对层数的限制,可根据设计者需要选择网络层数。

    二、神经网络的优点及特性

    1. 高度的并行性
    2. 高度的非线性局部作用
    3. 联想记忆功能和良好的容错性
    4. 良好的自适应和自学习能力
    5. 知识的分布存储
    6. 非凸性

    神经元的功能特性

    1. 时空整合功能
    2. 神经元的动态极性化
    3. 兴奋和一直兴奋状态
    4. 结构的可塑性
    5. 脉冲和电位信号的转换
    6. 突触延期和不应期
    7. 学习、遗忘和疲劳
      人类的大脑能够收到输入的信息的刺激由分布式并行处理的神经元相互连接进行非线性映射处理,从而实现复杂的信息处理和推理任务。

    神经结构

    在人工神经网络设计及应用研究中,通常需要考虑三个方面的内容,即神经元激活函数、神经元之间的连接形式和网络的学习(训练)。

    神经网络的学习形式:

    在构造神经网络时,其神经元的传递函数和转换函数就已经确定了

    神经网络的工作过程:

    神经网络的工作过程包括离线学习和在线判断两部分。学习过程中各神经元进行规则学习,权参数调整,进行非线性映射关系拟合以达到训练精度;判断阶段则是训练好的稳定的网络读取输入信息通过计算得到输出结果。

    神经网络的学习规则:

    神经网络的学习规则是修正权值的一种算法,分为联想式和非联想式学习,有监督学习和无监督学习等。下面介绍几个常用的学习规则。

    1. 误差修正型规则:是一种有监督的学习方法,根据实际输出和期望输出的误差进行网络连接权值的修正,最终网络误差小于目标函数达到预期结果。误差修正法,权值的调整与网络的输出误差有关, 它包括δ学习规则、Widrow-Hoff学习规则、感知器学习规则和误差反向传播的BP(Back Propagation)学习规则等。
      1) δ学习规则:
      Wij(t+1)=Wij(t)a(diyi)xj(t)
      其中Wij表示神经元j到神经元i的连接权,di是神经元i的期望输出,yi是神经元i的实际输出,xj表示神经元j状态,若神经元j处于激活态则xj为1,若处于抑制状态则xj为0或-1(根据激活函数而定)。a是表示学习速度的常数。假设xi为1,若diyi大,那么Wij将减小,若diyi小,那么Wij将变大。
    2. 竞争型规则:无监督学习过程,网络仅根据提供的一些学习样本进行自组织学习,没有期望输出,通过神经元相互竞争对外界刺激模式响应的权利进行网络权值的调整来适应输入的样本数据。
      对于无监督学习的情况,事先不给定标准样本,直接将网络置于“环境”之中,学习(训练)阶段与应用(工作)阶段成为一体。
    3. Hebb型规则:利用神经元之间的活化值(激活值)来反映它们之间联接性的变化,即根据相互连接的神经元之间的活化值(激活值)来修正其权值。Hebb规则如下:
      Wij(t+1)=Wij(t)+ayiyj
      其中Wij表示神经元j到神经元i的连接权,yiyj表示两个神经元的输出,a是表示学习速率的常数,如果yiyj同时被激活,即yiyj同时为正,那么wij将增大。如果yi被激活,而yj处于抑制状态,即yi为正yj为负,那么wij将变小。
      在Hebb学习规则中,学习信号简单地等于神经元的输出。Hebb学习规则代表一种纯前馈﹑无导师学习。该学习规则至今在各种神经网络模型中起着重要作用。典型的应用如利用Hebb规则训练线性联想器的权矩阵。
    4. 随机型规则:在学习过程中结合了随机、概率论和能量函数的思想,根据目标函数(即网络输出均方差)的变化调整网络的参数,最终使网络目标函数达到收敛值。

    激活函数:

    在神经网络中,网络解决问题的能力与效率除了与网络结构有关外,在很大程度上取决于网络所采用的激活函数。激活函数的选择对网络的收敛速度有较大的影响,针对不同的实际问题,激活函数的选择也应不同。
    常用的激活函数有以下几种形式:

    1. 阈值函数:该函数通常也称为阶跃函数。当激活函数采用阶跃函数时,人工神经元模型即为MP模型。此时神经元的输出取1或0,反应了神经元的兴奋或抑制。
    2. 线性函数:该函数可以在输出结果为任意值时作为输出神经元的激活函数,但是当网络复杂时,线性激活函数大大降低网络的收敛性,故一般较少采用。
    3. 对数S形函数:对数S形函数的输出介于0~1之间,常被要求为输出在0~1范围的信号选用。它是神经元中使用最为广泛的激活函数。
    4. 双曲正切S形函数:双曲正切S形函数类似于被平滑的阶跃函数,形状与对数S形函数相同,以原点对称,其输出介于-1~1之间,常常被要求为输出在-1~1范围的信号选用。

    神经元之间的连接形式

    1. 前向网络(前馈网络):网络可以分为若干“层”,各层按信号传输先后顺序依次排列,第i层的神经元只接受第(i-1)层神经元给出的信号,各神经元之间没有反馈。前馈型网络可用一有向无环路图表示。BP网络就是典型的前向网络。
    2. 反馈网络:典型的反馈型神经网络如下图a所示:
      这里写图片描述
      每个节点都表示一个计算单元,同时接受外加输入和其它各节点的反馈输入,每个节点也都直接向外部输出。Hopfield网络即属此种类型。在某些反馈网络中,各神经元除接受外加输入与其它各节点反馈输入之外,还包括自身反馈。有时,反馈型神经网络也可表示为一张完全的无向图,如上图b。图中,每一个连接都是双向的。这里,第i个神经元对于第j个神经元的反馈与第j至i神经元反馈之突触权重相等,也即wij=wji。

    三、人工神经网络模型

    分类

    按性能分:连续型和离散型网络,或确定型和随机型网络。
    按拓扑结构分:前向网络和反馈网络。
    按学习方法分:有教师(监督)的学习网络和无教师(监督)的学习网络。
    按连接突触性质分:一阶线性关联网络和高阶非线性关联网络。

    前向网络

    有自适应线性神经网络(AdaptiveLinear,简称Adaline)、单层感知器、多层感知器、BP等。前向网络,网络中各个神经元接受前一级的输入,并输出到下一级,网络中没有反馈,可以用一个有向无环路图表示。这种网络实现信号从输入空间到输出空间的变换,它的信息处理能力来自于简单非线性函数的多次复合。网络结构简单,易于实现。反传网络是一种典型的前向网络。

    反馈网络

    有Hopfield、Hamming、BAM等。反馈网络,网络内神经元间有反馈,可以用一个无向的完备图表示。这种神经网络的信息处理是状态的变换,可以用动力学系统理论处理。系统的稳定性与联想记忆功能有密切关系。Hopfield网络、波耳兹曼机均属于这种类型。

    反向传播模型也称B-P模型,

    是一种用于前向多层的反向传播学习算法。之所以称它是一种学习方法,是因为用它可以对组成前向多层网络的各人工神经元之间的连接权值进行不断的修改,从而使该前向多层网络能够将输入它的信息变换成所期望的输出信息。之所以将其称作为反向学习算法,是因为在修改各人工神经元的连接权值时,所依据的是该网络的实际输出与其期望的输出之差,将这一差值反向一层一层的向回传播,来决定连接权值的修改。
    B-P算法的学习过程如下:
    (1)、选择一组训练样例,每一个样例由输入信息和期望的输出结果两部分组成。
    (2)、从训练样例集中取一样例,把输入信息输入到网络中。
    (3)、分别计算经神经元处理后的各层节点的输出。
    (4)、计算网络的实际输出和期望输出的误差。
    (5)、从输出层反向计算到第一个隐层,并按照某种能使误差向减小方向发展的原则,调整网络中各神经元的连接权值。
    (6)、对训练样例集中的每一个样例重复(3)-(5)的步骤,直到对整个训练样例集的误差达到要求时为止。
    在以上的学习过程中,第(5)步是最重要的,如何确定一种调整连接权值的原则,使误差沿着减小的方向发展,是B-P学习算法必须解决的问题。
    B-P算法的优缺点:
    优点:理论基础牢固,推导过程严谨,物理概念清晰,通用性好等。所以,它是目前用来训练前向多层网络较好的算法。
    缺点:(1)、该学习算法的收敛速度慢;(2)、网络中隐节点个数的选取尚无理论上的指导;(3)、从数学角度看,B-P算法是一种梯度最速下降法,这就可能出现局部极小的问题。当出现局部极小时,从表面上看,误差符合要求,但这时所得到的解并不一定是问题的真正解。所以B-P算法是不完备的。
    BP算法局限性:
    (1)、在误差曲面上有些区域平坦,此时误差对权值的变化不敏感,误差下降缓慢,调整时间长,影响收敛速度。这时误差的梯度变化很小,即使权值的调整量很大,误差仍然下降很慢。造成这种情况的原因与各节点的净输入过大有关。
    (2)、存在多个极小点。从两维权空间的误差曲面可以看出,其上存在许多凸凹不平,其低凹部分就是误差函数的极小点。可以想象多维权空间的误差曲面,会更加复杂,存在更多个局部极小点,它们的特点都是误差梯度为0。BP算法权值调整依据是误差梯度下降,当梯度为0时,BP算法无法辨别极小点性质,因此训练常陷入某个局部极小点而不能自拔,使训练难以收敛于给定误差。
    BP算法改进:误差曲面的平坦区将使误差下降缓慢,调整时间加长,迭代次数增多,影响收敛速度;而误差曲面存在的多个极小点会使网络训练陷入局部极小,从而使网络训练无法收敛于给定误差。这两个问题是BP网络标准算法的固有缺陷。
    针对此,国内外不少学者提出了许多改进算法,几种典型的改进算法:

    (1)、增加动量项:标准BP算法在调整权值时,只按t时刻误差的梯度下降方向调整,而没有考虑t时刻以前的梯度方向,从而常使训练过程发生振荡,收敛缓慢。为了提高训练速度,可以在权值调整公式中加一动量项。大多数BP算法中都增加了动量项,以至于有动量项的BP算法成为一种新的标准算法。
    (2)、可变学习速度的反向传播算法(variable learning rate back propagation,VLBP):多层网络的误差曲面不是二次函数。曲面的形状随参数空间区域的不同而不同。可以在学习过程中通过调整学习速度来提高收敛速度。技巧是决定何时改变学习速度和怎样改变学习速度。可变学习速度的VLBP算法有许多不同的方法来改变学习速度。
    (3)、学习速率的自适应调节:可变学习速度VLBP算法,需要设置多个参数,算法的性能对这些参数的改变往往十分敏感,另外,处理起来也较麻烦。此处给出一简洁的学习速率的自适应调节算法。学习率的调整只与网络总误差有关。学习速率η也称步长,在标准BP中是一常数,但在实际计算中,很难给定出一个从始至终都很合适的最佳学习速率。从误差曲面可以看出,在平坦区内η太小会使训练次数增加,这时候希望η值大一些;而在误差变化剧烈的区域,η太大会因调整过量而跨过较窄的“凹坑”处,使训练出现振荡,反而使迭代次数增加。为了加速收敛过程,最好是能自适应调整学习率η,使其该大则大,该小则小。比如可以根据网络总误差来调整.
    (4)、引入陡度因子—-防止饱和:误差曲面上存在着平坦区。其权值调整缓慢的原因在于S转移函数具有饱和特性造成的。如果在调整进入平坦区后,设法压缩神经元的净输入,使其输出退出转移函数的饱和区,就可改变误差函数的形状,从而使调整脱离平坦区。实现这一思路的具体作法是在转移函数中引进一个陡度因子。
    BP神经网络设计的一般原则:关于它的开发设计,大多数是根据使用者的经验来设计网络结构﹑功能函数﹑学习算法﹑样本等。

    [1]、BP网络参数设计

    (1)、BP网络输入与输出参数的确定

    A、输入量的选择:
    a、输入量必须选择那些对输出影响大且能够检测或提取的变量;
    b、各输入量之间互不相关或相关性很小。从输入、输出量性质分类来看,可以分为两类:数值变量和语言变量。数值变量又分为连续变量或离散变量。如常见的温度,压力,电压,电流等就是连续变量;语言变量是用自然语言表示的概念。如红,绿,蓝;男,女;大,中,小,开,关,亮,暗等。一般来说,语言变量在网络处理时,需要转化为离散变量。
    c、输入量的表示与提取:多数情况下,直接送给神经网络的输入量无法直接得到,常常需要用信号处理与特征提取技术从原始数据中提取能反映其特征的若干参数作为网络输入。
    B、输出量选择与表示:
    a、输出量一般代表系统要实现的功能目标,如分类问题的类别归属等;
    b、输出量表示可以是数值也可是语言变量;

    (2)、训练样本集的设计

    网络的性能与训练用的样本密切相关,设计一个好的训练样本集既要注意样本规模,又要注意样本质量。
    A、样本数目的确定:一般来说样本数n越多,训练结果越能正确反映其内在规律,但样本的获取往往有一定困难,另一方面,当样本数n达到一定数量后,网络的精度也很难提高。
    选择原则:网络规模越大,网络映射关系越复杂,样本数越多。一般说来,训练样本数是网络连接权总数的5~10倍,但许多情况难以达到这样的要求。
    B、样本的选择和组织:
    a、样本要有代表性,注意样本类别的均衡;
    b、样本的组织要注意将不同类别的样本交叉输入;
    c、网络的训练测试,测试标准是看网络是否有好的泛化能力。测试做法:不用样本训练集中数据测试。一般是将收集到的可用样本随机地分成两部分,一部分为训练集,另一部分为测试集。若训练样本误差很小,而对测试集的样本误差很大,泛化能力差。

    (3)、初始权值的设计

    网络权值的初始化决定了网络的训练从误差曲面的哪一点开始,因此初始化方法对缩短网络的训练时间至关重要。
    神经元的作用函数是关于坐标点对称的,若每个节点的净输入均在零点附近,则输出均出在作用函数的中点,这个位置不仅远离作用函数的饱和区,而且是其变化最灵敏的区域,必使网络学习加快。从神经网络净输入表达式来看,为了使各节点的初始净输入在零点附近,如下两种方法被常常使用:
    A、取足够小的初始权值;
    B、使初始值为+1和-1的权值数相等。

    [2]、BP网络结构参数设计

    隐层结构设计
    (1)、隐层数设计:理论证明,具有单隐层的前馈网络可以映射所有连续函数,只有当学习不连续函数时才需要两个隐层,故一般情况隐层最多需要两层。一般方法是先设一个隐层,当一个隐层的节点数很多,仍不能改善网络性能时,再增加一个隐层。最常用的BP神经网络结构是3层结构,即输入层﹑输出层和1个隐层。
    (2)、隐层节点数设计:隐层节点数目对神经网络的性能有一定的影响。隐层节点数过少时,学习的容量有限,不足以存储训练样本中蕴涵的所有规律;隐层节点过多不仅会增加网络训练时间,而且会将样本中非规律性的内容如干扰和噪声存储进去。反而降低泛化能力。一般方法是凑试法:
    M-P:http://ibillxia.github.io/blog/2013/03/24/classes-of-neural-networks/
    综述:http://blog.csdn.net/app_12062011/article/details/54290982
    自组织:http://www.ziyoubaba.com/archives/606
    线性神经网络:http://blog.csdn.net/fieldoffier/article/details/44401305

    展开全文
  • 神经网络分类算法 数据挖掘

    万次阅读 2017-02-09 16:36:47
    神经网络分类介绍:  神经网络就是一组相互连接的输入输出单元,这些单元之间的每个连接都关联一个权重。在网络学习阶段,网络通过调整权重来实现输入样本与其相应(正确)类别的对应。由于网络学习主要是针对其中...

    神经网络分类介绍:

          神经网络就是一组相互连接的输入输出单元,这些单元之间的每个连接都关联一个权重。在网络学习阶段,网络通过调整权重来实现输入样本与其相应(正确)类别的对应。由于神经网络学习主要是针对其中的连接权重进行的,因此神经网络的学习有时也称为连接学习;神经网络的优点就是对噪声数据有较好适应能力,并且对未知数据也具有较好的预测分类能力;

    多层神经网络如图-4.9 所示,它包含两层处理单元(除输入层外);同样包含两个隐层的神经网络称为三层神经网络,如此等等。该网络是前馈的,即每一个反馈只能发送到前面的输出层或隐含层。它是全连接的,即每一个层中单元均与前面一层的各单元相连接。后传方法通过不断处理一个训练样本集,并将网络处理结果与每个样本已知类别相比较所获误差,来帮助完成学习任务。

     

    下面就以一个案例为准就行说明;以第一个训练元祖X={1,0,1} 其类标号为 1


    第一步:初始化network的所有权重和偏倚;网络的权重一般初始为小随机数(例如 -1.0 到1.0),具体初始数据如下:


    第二步:在终止循环条件下循环每个训练元祖,设X={1,0,1},其类标号Y为1;

    第三步:循环输入单元,输入单元的输入=输出,及I₁=O₁=1;I₂=O₂=0 ; I₃=O₂=1

    第四部:计算隐藏层或输出层的输入和输出;

    输入公式见下方:


    故可以求输入I₄= I₁*W₁₄+I₂*W₂₄+I₃*W₃₄+θ₄=1*0.2+0*0.4+1*(-0.5)+(-0.4)=-0.7

    输出公式见下方:


      O₄=1+(1+E[0.7])=0.332;

    按照输入和输出公式,可以分别求出4/5/6节点的输入和输出见下方:

     

    第五部:计算误差,对于隐藏节点和输出节点的误差计算公式不一样,见下方:

    输出层误差公式:


    隐藏层误差公式


    按照以上公式可以求 :(T为类标志)  

    Err6 = 0.474*(1-0.474)*(1-0.474)=0.1311

    Err4 = 0.332*(1-0.332)*Err6*W46=0.332*(1-0.332)*(-0.1311)*(-0.3)=-0.02087;

    计算结果分别如下:


    第五部:更新权重和偏倚值,公式如下:


    上面就是更新权重的公式,设置 L = 0.9,以W₁₄更新为例子说明:△W₁₄=0.9*(-0.0087)*1=-0.00783  故 W₁₄=△W₁₄+ W₁₄=0.19217

    最后各个更新数据如下:


    以上就是一个元祖的过程,训练时候循环大量元祖,更新权重和偏倚值,当达到跳出循环元祖条件时候,中断训练;

    中断训练的条件如下:









    展开全文
  • 目录 ...全程为人工神经网络,是一种模仿生物神经网络(大脑)的结构和功能的数学模型或计算机模型 生物神经细胞; 神经细胞是构成神经系统的基本单元,称为生物神经元,简称神经元 # 简单神经...

    目录

    1、神经网络:(Artifical Neural Network)

    2、MLP简介

    3、MLP方法

    4、MLP简单的二分类代码案例


    1、神经网络:(Artifical Neural Network)

    全程为人工神经网络,是一种模仿生物神经网络(大脑)的结构和功能的数学模型或计算机模型

    生物神经细胞;

    神经细胞是构成神经系统的基本单元,称为生物神经元,简称神经元

    # 简单神经网络

    S型函数,单个神经元。

    最简单的神经网络就是逻辑回归

    # 二进制是生物学和计算机学的链接

    # 神经网络的隐藏层不是越多越好,随着层数增多会达到一个阈值,再增加基本上不变,或者反而会减小。

    2、MLP简介

    MLP常常被用来做分类,每个输出对应一个不同的二进制分类(比如,垃圾邮件/正正常邮件,紧急/非紧急)

    01 每个分类是在互斥的情况下爱,输出层通常被修改成一个共享的soft-max函数。

    例如:图片数字的分类

    3、MLP方法

    sklearn.neural_network.MLPClassifier

    MLPClassifier(solver=’sgd’, activation=’relu’,alpha=1e-4,
    
    hidden_layer_sizes=(50,50), random_state=1,max_iter=10,verbose=10,learning_rate_init=.1)

    参数说明: 
    1. hidden_layer_sizes :例如hidden_layer_sizes=(50, 50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元。 
    2. activation :激活函数,{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 默认relu 
    - identity:f(x) = x 
    - logistic:其实就是sigmod,f(x) = 1 / (1 + exp(-x)). 
    - tanh:f(x) = tanh(x). 
    - relu:f(x) = max(0, x) 
    3. solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认adam,用来优化权重 
    - lbfgs:quasi-Newton方法的优化器 
    - sgd:随机梯度下降 
    - adam: Kingma, Diederik, and Jimmy Ba提出的机遇随机梯度的优化器 
    注意:默认solver ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。 
    4. alpha :float,可选的,默认0.0001,正则化项参数 
    5. batch_size : int , 可选的,默认’auto’,随机优化的minibatches的大小batch_size=min(200,n_samples),如果solver是’lbfgs’,分类器将不使用minibatch 
    6. learning_rate :学习率,用于权重更新,只有当solver为’sgd’时使用,{‘constant’,’invscaling’, ‘adaptive’},默认constant 
    - ‘constant’: 有’learning_rate_init’给定的恒定学习率 
    - ‘incscaling’:随着时间t使用’power_t’的逆标度指数不断降低学习率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t) 
    - ‘adaptive’:只要训练损耗在下降,就保持学习率为’learning_rate_init’不变,当连续两次不能降低训练损耗或验证分数停止升高至少tol时,将当前学习率除以5. 
     

    此方法详细介绍见:https://blog.csdn.net/u011311291/article/details/78743393 

    4、MLP简单的二分类代码案例

    import pandas
    
    data=pandas.read_csv('D:\\DATA\\pycase\\number2\\4.5\\Data.csv')
    
    # 1 数据质量分析(缺失值、异常值、一致性分析)基本描述、检查空值
    
    explore=data.describe()
    
    # 此处为神经网络模型,数据量大,且有特征标签不好插值。顾进行删除
    
    data=data.dropna()
    
    data.shape
    
    # 2 数据变换
    # 对离散特征进行虚拟变量处理
    # 分开定义变量为后续预测做铺垫,直接调用
    
    dummyColumns=[
            'Gender', 'Home Ownership', 
        'Internet Connection', 'Marital Status',
        'Movie Selector', 'Prerec Format', 'TV Signal'
        ]
    # 将逻辑变量进行类型转换
    
    for column in dummyColumns: # 遍历选择的列进行类型转化
        data[column]=data[column].astype('category')
        
    dummiesData=pandas.get_dummies(
            data, # 要处理的Dataframe
            columns=dummyColumns, # 要处理的列名,如果不指定该列,默认为处理所有的列 
            prefix_sep=" ",   # 前缀和离散值的分隔符,默认为下划线
            drop_first=True # 是否从备选项中删除第一个,建模的时候为避免共线性使用
            )
    
    # 以性别为列,通过去重查看处理效果,查看某列属性的防范,两种,“。” 和[]
    
    dummiesData['Gender Male'].unique()
    
    data.Gender.unique()
    
    data['Gender'].unique()
    
    """
    博士后 post-Doc
    博士   Doctorate
    硕士   Master's Degree
    学士   Bachelor's Degree
    副学士    Associate's Degree
    专业院校  Some College
    职业学校  Trade School
    高中      High School
    小学      Grade School
    """
    
    # 有大小离散特征值的转化
    
    educationLevelDict={
            'Post-Doc':9,
            'Doctorate':8,
            'Master\'s Degree':7,# 在这里需要转义字符“\”
            'Bachelor\'s Degree': 6,
            'Associate\'s Degree': 5,
            'Some College': 4,
            'Trade School': 3,
            'High School': 2,
            'Grade School': 1
            }
    # 增加数值列
    
    dummiesData['Education Level Map']=dummiesData['Education Level'].map(educationLevelDict)
    
    # 同理其他的可测量数值变量
    
    freqMap = {
        'Never': 0,
        'Rarely': 1,
        'Monthly': 2,
        'Weekly': 3,
        'Daily': 4
    }
    dummiesData['PPV Freq Map'] = dummiesData['PPV Freq'].map(freqMap)
    dummiesData['Theater Freq Map'] = dummiesData['Theater Freq'].map(freqMap)
    dummiesData['TV Movie Freq Map'] = dummiesData['TV Movie Freq'].map(freqMap)
    dummiesData['Prerec Buying Freq Map'] = dummiesData['Prerec Buying Freq'].map(freqMap)
    dummiesData['Prerec Renting Freq Map'] = dummiesData['Prerec Renting Freq'].map(freqMap)
    dummiesData['Prerec Viewing Freq Map'] = dummiesData['Prerec Viewing Freq'].map(freqMap)
    
    dummiesData.columns
    
    # 选取特征值
    
    dummiesSelect = [
        'Age', 'Num Bathrooms', 'Num Bedrooms', 'Num Cars', 'Num Children', 'Num TVs', 
        'Education Level Map', 'PPV Freq Map', 'Theater Freq Map', 'TV Movie Freq Map', 
        'Prerec Buying Freq Map', 'Prerec Renting Freq Map', 'Prerec Viewing Freq Map', 
        'Gender Male',
        'Internet Connection DSL', 'Internet Connection Dial-Up', 
        'Internet Connection IDSN', 'Internet Connection No Internet Connection',
        'Internet Connection Other', 
        'Marital Status Married', 'Marital Status Never Married', 
        'Marital Status Other', 'Marital Status Separated', 
        'Movie Selector Me', 'Movie Selector Other', 'Movie Selector Spouse/Partner', 
        'Prerec Format DVD', 'Prerec Format Laserdisk', 'Prerec Format Other', 
        'Prerec Format VHS', 'Prerec Format Video CD', 
        'TV Signal Analog antennae', 'TV Signal Cable', 
        'TV Signal Digital Satellite', 'TV Signal Don\'t watch TV'
    ]
    
    inputData = dummiesData[dummiesSelect]
    
    # 选取结果值,有空值,需要[]
    
    outputData=data.Gender
    
    outputData=dummiesData['Home Ownership Rent']
    
    # 导入神经网络的方法 
    
    from sklearn.neural_network import MLPClassifier
    
    for i in  range(1,11): # 遍历隐藏层从1到10
        ANNModel=MLPClassifier(
                activation='relu',  # 激活函数,类似S类型函数
                hidden_layer_sizes=i # 隐藏层越多,运算呈现几何级倍增,不是越多越好
                )
        ANNModel.fit(inputData,outputData)
        score=ANNModel.score(inputData,outputData)
        print(str(i)+","+str(score)) # 输出每个隐藏层对应的分数
    
    
    
    # 导入新数据进行训练和测试
    
    newData=pandas.read_csv('D:\\DATA\\pycase\\number2\\4.4\\newData.csv')
    newData=newData.dropna()
    
    # 将逻辑变量转化为虚拟变量,转换方式利用样本转化类型
    
    for column in dummyColumns: 
        newData[column]=newData[column].astype(
                'category',
                categories=data[column].cat.categories
                )
        
    # 依据样本字典进行新字段列的增加
    
    newData['Education Level Map'] = newData['Education Level'].map(educationLevelDict)
    
    newData['PPV Freq Map'] = newData['PPV Freq'].map(freqMap)
    newData['Theater Freq Map'] = newData['Theater Freq'].map(freqMap)
    newData['TV Movie Freq Map'] = newData['TV Movie Freq'].map(freqMap)
    newData['Prerec Buying Freq Map'] = newData['Prerec Buying Freq'].map(freqMap)
    newData['Prerec Renting Freq Map'] = newData['Prerec Renting Freq'].map(freqMap)
    newData['Prerec Viewing Freq Map'] = newData['Prerec Viewing Freq'].map(freqMap)
    
        
        
        
    dummiesNewData=pandas.get_dummies(
            newData,
            columns=dummyColumns,
            prefix=dummyColumns,# 列名的前缀,在多个列有相同离散项时候使用
            prefix_sep=" ",
            drop_first=True
            )
    
    
    
    inputNewData=dummiesNewData[dummiesSelect]
    
    ANNModel.predict(inputData)
    
    
    
    
    

     

    展开全文
  • Part1:PyTorch简单知识Part2:PyTorch的自动梯度计算Part3:使用PyTorch构建一个神经网络Part4:训练一个神经网络分类器Part5:数据并行化本文是关于Part4的内容。 Part4:训练一个神经网络分类器前面已经介绍了...

    前言

    本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。

    Part1:PyTorch简单知识

    Part2:PyTorch的自动梯度计算

    Part3:使用PyTorch构建一个神经网络

    Part4:训练一个神经网络分类器

    Part5:数据并行化


    本文是关于Part4的内容。

     

    Part4:训练一个神经网络分类器

    前面已经介绍了定义神经网络,计算损失和更新权重,这里介绍训练神经网络分类器。

     

    1 关于数据

    通常,当你需要处理图像、文本、饮品或者视频数据,你可以使用标准的python包将数据导入到numpy array中。之后,你可以将array转换到torch.*Tensor

    (1)    对于图像,PillowOpenCV等包非常有用。

    (2)    对于音频,scipylibrosa等包非常好。

    (3)    对于文本,原始Python或基于Cython的加载,或者NLTKSpaCy都是有用的。

    尤其对于视觉,我们创建了一个叫做torchvision的包,包含了对于常用数据集(如ImageNetCIFAR10MNIST等)的数据加载器和对于imagesviz的数据转换器,torchvision.datasets torch.utils.data.DataLoader

     

    在该教程中,我们使用CIFAR10数据集。它含有这些类:‘airplane’, ‘automobile’, ‘bird’, ‘cat’,‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’. 这些图像的尺寸是3*32*32,即3通道的彩色图像,尺寸为32*32

     cifar10


    2 训练图像分类器

    我们按照如下步骤:

    (1)    使用torchvision导入并且正规化CIFAR10的训练集和测试集

    (2)    定义一个卷积神经网络

    (3)    定义一个损失函数

    (4)    在测试数据上训练该网络

    (5)    在测试数据上测试该网络


    2.1 导入和正规化CIFAR10

    使用torchvision,加载CIFAR10很容易。

    import torch
    import torchvision
    import torchvision.transforms as transforms

     

    torchvision数据集的输出是[0,1]区间的PILImage。我们把这些图像转换到[-1,1]区间的Tensor

    transform = transforms.Compose(
        [transforms.ToTensor(),
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
    
    trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                            download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                              shuffle=True, num_workers=2)
    
    testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                           download=True, transform=transform)
    testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                             shuffle=False, num_workers=2)
    
    classes = ('plane', 'car', 'bird', 'cat',
               'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

     

    我们来显示一些训练图像。

    import matplotlib.pyplot as plt
    import numpy as np
    
    # functions to show an image
    
    
    def imshow(img):
        img = img / 2 + 0.5     # unnormalize
        npimg = img.numpy()
        plt.imshow(np.transpose(npimg, (1, 2, 0)))
    
    
    # get some random training images
    dataiter = iter(trainloader)
    images, labels = dataiter.next()
    
    # show images
    imshow(torchvision.utils.make_grid(images))
    # print labels
    print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

     

     

     

    2.2 定义卷积神经网络

    定义一个适用于3通道图像的卷积神经网络。

    from torch.autograd import Variable
    import torch.nn as nn
    import torch.nn.functional as F
    
    
    class Net(nn.Module):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = nn.Conv2d(3, 6, 5)
            self.pool = nn.MaxPool2d(2, 2)
            self.conv2 = nn.Conv2d(6, 16, 5)
            self.fc1 = nn.Linear(16 * 5 * 5, 120)
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)
    
        def forward(self, x):
            x = self.pool(F.relu(self.conv1(x)))
            x = self.pool(F.relu(self.conv2(x)))
            x = x.view(-1, 16 * 5 * 5)
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x
    
    
    net = Net()

     

    2.3 定义损失函数和优化器

    使用分类交叉熵损失和带有动量的随机梯度下降。

    import torch.optim as optim
    
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

     

    2.4 训练网络

    我们只需要在数据上迭代,把输入数据交给网络并且优化即可。

    for epoch in range(2):  # loop over the dataset multiple times
    
        running_loss = 0.0
        for i, data in enumerate(trainloader, 0):
            # get the inputs
            inputs, labels = data
    
            # wrap them in Variable
            inputs, labels = Variable(inputs), Variable(labels)
    
            # zero the parameter gradients
            optimizer.zero_grad()
    
            # forward + backward + optimize
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
    
            # print statistics
            running_loss += loss.data[0]
            if i % 2000 == 1999:    # print every 2000 mini-batches
                print('[%d, %5d] loss: %.3f' %
                      (epoch + 1, i + 1, running_loss / 2000))
                running_loss = 0.0
    
    print('Finished Training')

     

    预期输出:

    [12000] loss: 2.191

    [14000] loss: 1.866

    [16000] loss: 1.696

    [18000] loss: 1.596

    [1, 10000] loss: 1.502

    [1, 12000] loss: 1.496

    [22000] loss: 1.422

    [24000] loss: 1.370

    [26000] loss: 1.359

    [28000] loss: 1.321

    [2, 10000] loss: 1.311

    [2, 12000] loss: 1.275

    FinishedTraining

     

    2.5 在测试数据上测试网络

    我们已经训练了一个网络。现在对其在测试数据上测试。第一步,显示一个来自测试集的图像。

    dataiter = iter(testloader)
    images, labels = dataiter.next()
    
    # print images
    imshow(torchvision.utils.make_grid(images))
    print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
    




    预期输出:

    GroundTruth:    cat  ship  ship  plane

     

    使用训练好的网络来预测这些图像应该属于哪类。

    outputs = net(Variable(images))

     

    输出的是关于10个类别的能量值。哪个类别能量值高,网络就认为图像属于哪一类。因此我们需要获取最高能量值的索引。

    _, predicted = torch.max(outputs.data, 1)
    
    print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]
                                  for j in range(4)))

     

    预期输出:

    Predicted:    cat  ship   car   plane

     

    现在看一下网络在整个数据集上的表现。

    correct = 0
    total = 0
    for data in testloader:
        images, labels = data
        outputs = net(Variable(images))
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum()
    
    print('Accuracy of the network on the 10000 test images: %d %%' % (
        100 * correct / total))

     

    预期输出:

    Accuracy of the network on the 10000 test images: 54 %

     

    这看起来比偶然准确率(10%)要好。看起来,训练有一定效果。

    看一下哪些类别表现好,哪些表现不好。

    class_correct = list(0. for i in range(10))
    class_total = list(0. for i in range(10))
    for data in testloader:
        images, labels = data
        outputs = net(Variable(images))
        _, predicted = torch.max(outputs.data, 1)
        c = (predicted == labels).squeeze()
        for i in range(4):
            label = labels[i]
            class_correct[label] += c[i]
            class_total[label] += 1
    
    
    for i in range(10):
        print('Accuracy of %5s : %2d %%' % (
            classes[i], 100 * class_correct[i] / class_total[i]))

     

    预期输出:

    Accuracyofplane : 60 %

    Accuracyof   car : 46 %

    Accuracyof  bird : 44 %

    Accuracyof   cat : 35 %

    Accuracyof  deer : 38 %

    Accuracyof   dog : 43 %

    Accuracyof  frog : 57 %

    Accuracyofhorse : 76 %

    Accuracyof  ship : 71 %

    Accuracyoftruck : 74 %

     

    3 在GPU上训练

    下面这句话会递归遍历全部的模块并且将它们的参数和缓冲区转到CUDA tensors

    net.cuda()


    记住,还需要在每一步将输入和目标值发送到GPU

    inputs, labels = Variable(inputs.cuda()), Variable(labels.cuda())

     

    当网络非常大而复杂的时候,这种加速是非常明显的。


    展开全文
  • 本文主要内容包括: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 。   第0节、引例   本文以Fisher的Iris数据集作为神经网络程序的测试...
  • 遥感影像的人工神经网络分类

    千次阅读 2014-04-28 14:22:29
    遥感影像的人工神经网络分类 B P人工神经网络分类中输入层结点数等于参与分类数据的特征空间维数 , 每个输入结点表示特征向 量 的 分 量 数 据. 对 原 始 NDV I 数 据 ( V GT2 S,SP O T)进行数据提取 、 月合成与...
  • 神经网络分类与预测的基本原理

    千次阅读 2020-05-07 17:10:25
    神经网络虽然用到了数学,但是它不像数学这样“严谨”,它不像传统的机器学习手段(比如决策树、随机森林、近邻法等)一样,能让我们清楚地知道它到底学了什么,虽然现在有很多人致力于研究神经网络背后原理——它到底...
  • 在opencv中支持神经网络分类器,本文尝试在python中调用它。 和前面的贝叶斯分类器一样,神经网络也遵循先训练再使用的方式,我们直接在贝叶斯分类器的测试代码上做简单修改,完成两类数据点的分类。
  • iris 神经网络分类

    千次阅读 2018-07-11 15:00:07
    1  鸢尾花分类——神经网络详解 2  神经网络用作分类
  • 人工神经网络分类

    千次阅读 2011-04-08 21:52:00
     人工神经网络是一个非线性的有向图,图中含有可以通过改变权大小来存放模式的加权边,并且可以从不完善的或未知的输入找到模式。从另一个方面说神经网络就像一个网框,似乎任何东西都可以往里面装,但是,...
  • 针对鸢尾花(Iris)数据集,基于scikit-learn训练logistic Regression分类器,基于Keras构建并训练三层前馈神经网络分类器,对比两者的正确率差异。 Keras深度学习库入门级教程,“Hello world” in Keras!
  • 5.创建mlp神经网络分类器create_ocr_class_mlp,然后训练 6.保存.omc文件 7.识别 按照如上的流程,通过一张图实现二十六个字母的训练,在另一张图上实现字母的识别,代码部分包含详细的注释,直接贴上代码如下: dev...
  • 人工神经网络(Artificial Neural Network)分类算法属于监督学习算法。人工神经网络(Artificial Neural Network)是模拟神经元的处理信息的数学模型。神经网络包含多个层次,同层之间的神经元相互之间不进行数据通信;...
  • 前一篇文章分享了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。这篇文章将详细讲解循环神经网络RNN的原理知识,并采用TensorFlow实现手写数字识别的RNN分类案例及可视化呈现。基础性文章,希望...
  • 图事-matlab之神经网络分类

    千次阅读 2015-07-06 16:14:36
    目的: p1数据集是10类,p2数据集是01类 ,训练一个神经网络将这两个数据集区分开。以后的测试数据输入神经网络后能分到对应的类。 一 训练数据准备  x1 x2  y1 y2 ps:从excle...
  • 继上文的集成学习模型之后,本文实践使用的pyspark提供的多层感知机神经网络模型,这是一种比较简单但是却又很重要的神经网络模型。MLP是一种前向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP可以被...
  • 分析 one-hot 编码如何简化了神经网络模型复杂度。
  • BP神经网络分类器的设计

    万次阅读 2016-03-10 20:12:54
    1.BP神经网络训练过程论述  BP网络结构有3层:输入层、隐含层、输出层,如图1所示。 图1 三层BP网络结构  3层BP神经网络学习训练过程主要由4部分组成:输入模式顺传播(输入模式由输入层经隐含层向输出层传播...
  • # evaluate training set accuracy scores = np.dot(X, W) + b predicted_class = np.argmax(scores, axis=1)#返回最大值的列标 print 'training accuracy: %.2f' % (np.mean(predicted_class == y))

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,024
精华内容 77,209
关键字:

神经网络分类