精华内容
下载资源
问答
  • MLP(多层感知器)是一种前馈神经网络,可将输入数据集映射到适当的输出集。 MLP 由有向图中的几节点(顶点)组成,每一都完全连接到下一。 除了输入节点,每个节点都是一个具有激活函数的神经元。 MLP ...
  • 用Python实现多层感知神经网络

    千次阅读 2020-09-07 23:01:29
    我将介绍在Python中创建多层感知器(MLP)神经网络的基本知识。 感知器是神经网络的基本组成部分。感知器的输入函数是权重,偏差和输入数据的线性组合。具体来说:in_j = weight input + bias.(in_j =权重输入+偏差)...

    作者|Vivek Patel 编译|Flin 来源|towardsdatascience

    除非你能学习到一些东西,否则不要重复造轮子。

    强大的库已经存在了,如:TensorFlow,PyTorch,Keras等等。我将介绍在Python中创建多层感知器(MLP)神经网络的基本知识。

    感知器是神经网络的基本组成部分。感知器的输入函数是权重,偏差和输入数据的线性组合。具体来说:in_j = weight input + bias.(in_j =权重输入+偏差)。在每个感知器上,我们都可以指定一个激活函数g。

    激活函数是一种确保感知器“发射”或仅在达到一定输入水平后才激活的数学方法。常见的非线性激活函数为S型,softmax,整流线性单位(ReLU)或简单的tanH。

    激活函数有很多选项,但是在本文中我们仅涉及Sigmoid和softmax。

    图1:感知器

    对于有监督的学习,我们稍后将输入的数据通过一系列隐藏层转发到输出层。这称为前向传播。在输出层,我们能够输出预测y。通过我们的预测y*,我们可以计算误差| y-y | 并使误差通过神经网络向后传播。这称为反向传播。通过随机梯度下降(SGD)过程,将更新隐藏层中每个感知器的权重和偏差。

    图2:神经网络的基本结构

    现在我们已经介绍了基础知识,让我们实现一个神经网络。我们的神经网络的目标是对MNIST数据库中的手写数字进行分类。我将使用NumPy库进行基本矩阵计算。

    在我们的问题中,MNIST数据由 [748,1] 矩阵中的8位颜色通道表示。从本质上讲,我们有一个 [748,1] 的数字矩阵,其始于[0,1,.... 255],其中0表示白色,255表示黑色。

    结果

    MNIST手写数字数据库包含60,000个用于训练目的的手写示例和10,000个用于测试目的的示例。在对60,000个示例进行了30个epoch的训练之后,我在测试数据集上运行了经过训练的神经网络,并达到了93.2%的准确性。甚至可以通过调整超参数来进一步优化。

    它是如何工作的?

    本文分为5个部分。这些部分是:

    (1)激活函数 (2)权重初始化 (3)偏差初始化 (4)训练算法 (5)进行预测

    1. 激活函数

    Sigmoid是由等式1 /(1+ exp(-x))定义的激活函数,将在隐藏层感知器中使用。

    Softmax是一个激活函数,当我们要将输入分为几类时,它通常在输出层中使用。在我们的例子中,我们希望将一个数字分成10个bucket[0,1,2,…,9]中的一个。它计算矩阵中每个条目的概率;概率将总计为1。具有最大概率的条目将对应于其预测,即0,1,…,9。Softmax定义为exp(x)/ sum(exp(x))。

    图3:激活函数的实现

    2. 权重初始化

    对于我们的每个隐藏层,我们将需要初始化权重矩阵。有几种不同的方法可以做到这一点,这里是4。

    1. 零初始化-初始化所有权重= 0。

    2. 随机初始化-使用随机数初始化权重,而不是完全随机。我们通常使用标准正态分布(均值0和方差1)中的随机数。

    3. Xavier初始化-使用具有设定方差的正态分布中的随机数初始化权重。我们将基于上一层的大小设置方差。

    如上所述,进入感知器的边缘乘以权重矩阵。关键的一点是,矩阵的大小取决于当前图层的大小以及它之前的图层。明确地,权重矩阵的大小为[currentLayerSize,previousLayerSize]。

    如上所述,进入感知器的边缘乘以权重矩阵。关键的一点是,矩阵的大小取决于当前图层的大小以及它之前的图层。明确地,权重矩阵的大小为[currentLayerSize,previousLayerSize]。

    假设我们有一个包含100个节点的隐藏层。我们的输入层的大小为[748,1],而我们所需的输出层的大小为[10,1]。输入层和第一个隐藏层之间的权重矩阵的大小为[100,748]。隐藏层之间的每个权重矩阵的大小为[100,100]。最后,最终隐藏层和输出层之间的权重矩阵的大小为[10,100]。

    出于教育目的,我们将坚持使用单个隐藏层;在最终模型中,我们将使用多层。

    图4:权重初始化实现

    3. 偏差初始化

    像权重初始化一样,偏置矩阵的大小取决于图层大小,尤其是当前图层大小。偏置初始化的一种方法是将偏置设置为零。

    对于我们的实现,我们将需要为每个隐藏层和输出层提供一个偏差。偏置矩阵的大小为[100,1],基于每个隐藏层100个节点,而输出层的大小为[10,1]。

    图5:偏置初始化实现

    4. 训练算法

    前面已经说过,训练是基于随机梯度下降(SGD)的概念。在SGD中,我们一次只考虑一个训练点。

    在我们的示例中,我们将在输出层使用softmax激活。将使用“交叉熵损失”公式来计算损失。对于SGD,我们将需要使用softmax来计算交叉熵损失的导数。也就是说,此导数减少为y* -y,即预测y*减去期望值y。

    图6:关于softmax激活的交叉熵损失及其导数

    我们还需要编写S型激活函数的导数。在图7中,我定义了S型函数及其衍生函数

    图7:Sigmoid函数(上)及其导数(下)

    通常,神经网络将允许用户指定几个“超参数”。在我们的实施中,我们将着重于允许用户指定epoch,批处理大小,学习率和动量。还有其他优化技术!

    1. 学习率(LR):学习率是一个参数,用户可以通过它指定网络允许我们学习和更新其参数的速度。选择一个好的学习率是一门艺术。如果LR太高,我们可能永远不会收敛于良好的可接受的训练错误。如果LR太低,我们可能会浪费大量的计算时间。

    2. epoch:epoch是整个训练集中的一个迭代。为了确保我们不会过度拟合早期样本中的数据,我们会在每个时期之后对数据进行随机排序。

    3. 批次大小:通过Epoc2h的每次迭代,我们将分批训练数据。对于批次中的每个训练点,我们将收集梯度,并在批次完成后更新权重/偏差。

    4. 动量:这是一个参数,我们将通过收集过去的梯度的移动平均值并允许在该方向上的运动来加速学习。在大多数情况下,这将导致更快的收敛。典型值范围从0.5到0.9。

    下面,我编写了一些通用的伪代码来模拟反向传播学习算法的概况。为了便于阅读,已将诸如计算输出和将训练数据分成批次之类的任务作为注释编写。

    现在,我们将展示伪代码的实现.

    5. 做出预测

    现在,我们仅缺少此实现的一个关键方面。预测算法。在编写反向传播算法的过程中,我们已经完成了大部分工作。我们只需要使用相同的前向传播代码即可进行预测。输出层的softmax激活函数将计算大小为[10,1]的矩阵中每个条目的概率。

    我们的目标是将数字分类为0到9。因此,aj2矩阵的索引将与预测相对应。概率最大的索引将由np.argmax()选择,并将作为我们的预测。

    结论

    这就对了!我们结束了。我们已经用Python编写了神经网络的实现。

    但是,我们如何选择最佳参数?我们可以使用算法的一般知识来选择有意义的超参数。我们需要选择能概括但不能过度拟合数据的超参数。我们可以调整动量,学习率,时期数,批处理大小和隐藏节点的数量,以实现我们的目标。向前迈出一步,我们可以编写更多算法来为我们做这件事!

    遗传算法是一种AI算法,可用于选择最佳参数。遗传算法的思想是创建一组具有不同参数的子代,并让他们产生与参数相关的测试错误。我们可以对具有最佳超参数的神经网络进行繁殖和变异,以找到性能更好的参数。花费大量时间后,我们将能够学习有关超参数情况的大量知识,并找到新的最佳超参数值。

    我们还可以采取其他措施来减少测试错误吗?是的,我们可以缩放输入数据。像许多算法一样,数量更多会对算法的结果产生重大影响。在我们的示例中,数字范围为[0到255]。如果我们按比例缩放数字,使它们的范围从[0到1],则可以减少该偏差。

    感谢你的阅读!

    原文链接:https://towardsdatascience.com/implementing-a-multi-layer-perceptron-neural-network-in-python-b22b5a3bdfa3

    欢迎关注磐创AI博客站: http://panchuang.net/

    sklearn机器学习中文官方文档: http://sklearn123.com/

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

    展开全文
  • 神经网络模型也是近些年大火的人工智能行业基础算法,SPSS软件中支持训练出多层感知神经网络模型,今天我们一起来看看它是如何通过该专业统计分析软件训练出来的。 一、多层感知器总体介绍 我们准备好训练集数据...

    在上文《用SPSS的评分向导功能快速得出模型预测结果》中我们说到,评分向导功能可通过导入的模型快速预测模型结果,而这一功能的使用模型较常使用神经网络模型。

    神经网络模型也是近些年大火的人工智能行业基础算法,SPSS软件中支持训练出多层感知器神经网络模型,今天我们一起来看看它是如何通过该专业统计分析软件训练出来的。

    一、多层感知器总体介绍

    我们准备好训练集数据后,点击【分析】菜单中的【神经网络】,选择第一项【多层感知器】,开始训练神经网络模型。

     

     

    图1:多层感知器

    多层感知器分为8个选项菜单,“变量”和“分区”菜单是训练前的数据准备;“体系结构”菜单用于定义模型的各项参数和优化方法;“训练”菜单用于调整模型的训练参数,如训练批次;“输出”、“保存”和“导出”菜单用于设置模型输出和保存的内容;“选项”菜单用于设置模型除上述步骤外的其他设置项,如模型最长训练时间。

     

     

    图2:八大菜单

    二、操作步骤

    第一步:我们先在【变量】菜单中,填入模型的因变量、因子和协变量,因为各个协变量定义标准都不同,因此我们还需对其标准化,如图3。

     

     

    图3:变量菜单设置

    第二步:接下来在“分区”菜单中,将数据按照默认7:3的比例,分为训练集和验证集,训练集用于训练模型,验证集用于验证模型结果,反向优化模型参数,一般来说,训练集数量大于验证集。

     

     

    图4:分为训练集和验证集

    第三步:定义神经网络模型结构,这一步非常重要,默认勾选的是“体系结构自动选择”,我们不采取默认方式,而是勾选“定制体系结构”,然后修改其中的隐藏层数、隐藏层激活函数、输出层激活函数、隐藏层每一层网络的单元数。

    一开始上述参数根据过往调参经验设定即可,后续通过模型的准确率,我们需要不断调整上述参数,最终调整到合适的参数,得到准确率较满意的神经网络模型为最终模型。

     

     

    图5:设定模型参数

    第四步:在“训练”菜单中,我们需设置模型训练的批次、优化算法和其他训练选项,如初始学习率。以上训练参数都会在一定程度上影响模型的训练准确率和训练速度,设定太大则训练时间太长,太小则模型拟合的准确率不够高,因此也属于经验参数,需要反复通过训练模型来逐步确定。

     

     

    图6:设定训练参数

    第五步:设定我们要输出的内容,如ROC曲线、神经网络图、分类结果等,设定的内容最终会在模型训练后以图表形式展示出来。完成设置后,点击“确定”按钮,我们开始来训练模型。

     

     

    图7:设定输出参数

    三、模型结果

    等待部分时间后,模型训练完成,训练完成后的神经网络模型如下图8所示。

     

     

    图8:神经网络图

    我们在网络信息表格中,就可以看到该神经网络的具体参数,如使用的激活函数、每个隐藏层的单元数等等。

     

     

    图9:网络信息

    训练神经网络是一项非常花费时间的工作,不仅是因为它训练时间长、而且也因为它需要在训练过程中进行反复调参,使模型向更好的结果进行调整拟合,当然神经网络模型也能实现非常强大的功能,逐渐在我们的生活中占据更高的比重。这就是本文关于SPSS软件训练神经网络的简单教程,更多关于IBM SPSS Statistics使用教学,大家可到IBM SPSS Statistics中文网站上查看。 

    展开全文
  • RBF神经网络多层感知器网络的比较 RBF 网络与多层感知器都是非线性多层前向网络 , 它们都是通用逼近器 。 对于任一 个多层感知器 , 总存在一个 RBF 网络可以代替它 , 反之亦然 。 但是 , 这两个网络也存在着 ...
    径向基神经网络与多层感知器的区别
    细致说明
    RBF神经网络与多层感知器网络的比较
    RBF 网络与多层感知器都是非线性多层前向网络 , 它们都是通用逼近器 。 对于任一
    个多层感知器 , 总存在一个 RBF 网络可以代替它 , 反之亦然 。 但是 , 这两个网络也存在着
    很多不同点 。
    ① RBF 网络只有一个隐层 , 而多层感知器的隐层可以是一层也可以是多层的 。
    ② 多层感知器的隐层和输出层其神经元模型是一样的 。 而 RBF 网络的隐层神经元和输出层神经元不仅模型不同 , 而且在网络中起到的作用也不一样 。

    ③ RBF 网络的隐层是非线性的 , 输出层是线性的 。 然而 ,当用多层感知器解决模式分类问题时 , 它的隐层和输出层通常选为非线性的 。 当用多层感知器解决非线性回归问题时 , 通常选择线性输出层 。
    ④ RBF 网络的基函数计算的是输入向量和中心的欧氏距离 , 而多层感知器隐单元的激励函数计算的是输入单元和连接权值间的内积 。
    ⑤ RBF 网络使用局部指数衰减的非线性函数(如高斯函数)对非线性输入输出映射进行局部逼近 。 多层感知器(包括 BP 网)的隐节点采用输入模式与权向量的内积作为激活函数的自变量 , 而激活函数则采用 Sigmoid 函数或硬限幅函数 , 因此多层感知器是对非线性映射的全局逼近 。 RBF 网最显著的特点是隐节点采用输入模式与中心向量的距离(如欧氏距离) 作为函数的自变量 , 并使用径向基函数(如 Gaussian 函数)作为激活函数 。径向基函数关于 N 维空间的一个中心点具有径向对称性 , 而且神经元的输入离该中心点越远 , 神经元的激活程度就越低 。 隐节点的这个特性常被称为“局部特性” 。

    由于 RBF 网络能够逼近任意的非线性函数 ,可以处理系统内在的难以解析的规律性 , 并且具有很快的学习收敛速度 , 因此 RBF 网络有较为广泛的应用 。 目前 RBF 网络已成功地用于非线性函数逼近 、时间序列分析 、数据分类 、模式识别 、信息处理 、图像处理 、系统建模 、控制和故障诊断等 。
    展开全文
  • 人工神经网络(ANN) 简称神经网络(NN),能模拟生物神经系统对物体所作出的交互反应,是由具有适应性的简单单元(称为神经元)组成的广泛并行互连网络。 二、M-P神经元 “M-P神经元模型”(McCulloch and Pitts,...

    一、简述

    人工神经网络(ANN) 简称神经网络(NN),能模拟生物神经系统对物体所作出的交互反应,是由具有适应性的简单单元(称为神经元)组成的广泛并行互连网络。

     

    二、M-P神经元

    “M-P神经元模型”(McCulloch and Pitts,1943)是开创性的人工神经元模型,将复杂的生物神经元活动通过简单的数学模型表示出来,提出最早且影响最大。

     如下图所示,来自其它神经元的信号,,传递过来作为输入信号,并通过带权重的连接 (connection) 继续传递,然后神经元的总输入值与阈值 θ 作比较,最后经过激活函数f产生神经元的输出: 

    三、多层感知器(MLP)

    1、介绍

    多层感知器(Multi-Layer Perceptron,MLP)也叫人工神经网络(Artificial Neural Network,ANN),是常见的一种ANN算法。MLP算法一般包括三层,分别是一个输入层、一个或多个隐藏层、一个输出层的神经网络组成。每一层由一个或多个神经元互相连结,且一个“神经元”的输出便是另一个“神经元”的输入。最简单的MLP需要有一层隐层,即输入层、隐层和输出层才能称为一个简单的神经网络,习惯原因我之后会称为神经网络。

    通俗而言,神经网络是仿生物神经网络而来的一种技术,通过连接多个特征值,经过线性和非线性的组合,最终达到一个目标,这个目标可以是识别这个图片是不是一只猫,是不是一条狗或者属于哪个分布。

    2、感知机(perceptron)

    感知机由两层神经元组成,输入层接收外界输入信号,而输出层则是一个 M-P 神经元。  实际上,感知机可视为一个最简单的“神经网络”,用它可很容易的实现逻辑与、或、非等简单运算。

    3、层级结构

    常见的神经网络,可分为三层:输入层、隐含层、输出层。输入层接收外界输入,隐层和输出层负责对信号进行加工,输出层输出最终的结果。

    以下图为例:每层神经元与下一层神经元全互连,而同层神经元之间不连接,也不存在跨层连接,这样的结构称为“多层前馈神经网络”(multi-layer feedforward neural networks)

    4、神经网络工作流程

    以下图中单隐层的神经网络为例,说一下神经网络的具体流程。大致模型如图所示:

    首先我们先对图中的参数做一个解释:

    其中,第0层(输入层),我们将x1,x2和x3向量化为X;0层和1层(隐层)之间,存在权重w1(x1到各个隐层),w2...w4,向量化为W[1];注:其中[1]表示第1层的权重,偏置b同理;

    (1)第1层

    对于第1层,计算公式为:

    Z[1] = W[1]X + b[1]

    A[1] = sigmoid(Z[1])

    其中Z为输入值的线性组合,A为Z通过激活函数sigmoid的值,对于第1层的输入值为X,输出值为A,也是下一层的输入值;

    (2)第2层

    1层和2层(输出层)之间,与0层和1层之间类似,其计算公式如下:

    Z[2] = W[2]A[1] + b[2]

    A[2] = sigmoid(Z[2])

    yhat = A[2]

    其中yhat即为本次神经网络的输出值。

    5、激活函数

    关于激活函数,首先要搞清楚的问题是,激活函数是什么,有什么用?不用激活函数可不可以?答案是不可以。激活函数的主要作用是提供网络的非线性建模能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。 那么激活函数应该具有什么样的性质呢?

    可微性: 当优化方法是基于梯度的时候,这个性质是必须的。

    单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。

    输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate

    从目前来看,常见的激活函数多是分段线性和具有指数形状的非线性函数

    (1)sigmoid

    sigmoid 是使用范围最广的一类激活函数,具有指数函数形状,它在物理意义上最为接近生物神经元。此外,(0, 1) 的输出还可以被表示作概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数。

    然而,sigmoid也有其自身的缺陷,最明显的就是饱和性。从上图可以看到,其两侧导数逐渐趋近于0

    具有这种性质的称为软饱和激活函数。具体的,饱和又可分为左饱和与右饱和。与软饱和对应的是硬饱和, 即

    sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个 f′(x)因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f′(x)就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。

    此外,sigmoid函数的输出均大于0,使得输出不是0均值,这称为偏移现象,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。

    (2)Tanh

    tanh也是一种非常常见的激活函数。与sigmoid相比,它的输出均值是0,使得其收敛速度要比sigmoid快,减少迭代次数。然而,从途中可以看出,tanh一样具有软饱和性,从而造成梯度消失。

    (3)ReLU,P-ReLU, Leaky-ReLU

    关于ReLU的介绍参考链接。ReLU的全称是Rectified Linear Units,是一种后来才出现的激活函数。 可以看到,当x<0时,ReLU硬饱和,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。这让我们能够直接以监督的方式训练深度神经网络,而无需依赖无监督的逐层预训练。

    然而,随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。与sigmoid类似,ReLU的输出均值也大于0,偏移现象和 神经元死亡会共同影响网络的收敛性。

    针对在x<0的硬饱和问题,我们对ReLU做出相应的改进,使得

    这就是Leaky-ReLU, 而P-ReLU认为,α也可以作为一个参数来学习,原文献建议初始化a为0.25,不采用正则。

    (4)ELU

    融合了sigmoid和ReLU,左侧具有软饱和性,右侧无饱和性。右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。在 ImageNet上,不加 Batch Normalization 30 层以上的 ReLU 网络会无法收敛,PReLU网络在MSRA的Fan-in (caffe )初始化下会发散,而 ELU 网络在Fan-in/Fan-out下都能收敛。

    (5)Maxout

    在我看来,这个激活函数有点大一统的感觉,因为maxout网络能够近似任意连续函数,且当w2,b2,…,wn,bn为0时,退化为ReLU。Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量。

    对于激活函数的选择,是神经网络中很重要的一步,对比sigmoid函数和tanh函数在不同层的使用效果:

    • 隐藏层:tanh函数的表现要好于sigmoid函数,因为tanh的取值范围在[-1,1]之间,均值为0,实际上起到了归一化(使图像分布在0周围,得到的结果更方便使用梯度下降)的效果。
    • 输出层:对于二分类而言,实际上是在计算yhat的概率,在[0,1]之间,所以sigmoid函数更优。

    然而在sigmoid函数和ReLU函数中,当Z很大或很小时,Z的导数会变得很小,趋紧于0,这也称为梯度消失,会影响神经网络的训练效率。

    ReLU函数弥补了二者的缺陷,当z>0时,梯度始终为1,从而提高神经网络的运算速度。然而当z<0时,梯度始终为0。但在实际应用中,该缺陷影响不是很大。

    Leaky ReLU是对ReLU的补偿,在z<0时,保证梯度不为0。

    怎么选择激活函数呢? 
      我觉得这种问题不可能有定论的吧,只能说是个人建议。 
      如果你使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让你的网络出现很多坏死的 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout. 
      友情提醒:最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout. 
      还有,通常来说,很少会把各种激活函数串起来在一个网络中使用的。  

    总结而言:在选择激活函数的时候,如果不知道该选什么的时候就选择ReLU,当然具体训练中,需要我们去探索哪种函数更适合。

    6、损失函数

    参考链接:链接1  链接2

    7、Backprop

    BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科研小组提出,参见他们发表在Nature上的论文 Learning representations by back-propagating errors 。

    BP神经网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的 输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断 调整网络的权值和阈值,使网络的误差平方和最小。

    BP算法的基本思想

    上一次我们说到,多层感知器在如何获取隐层的权值的问题上遇到了瓶颈。既然我们无法直接得到隐层的权值,能否先通过输出层得到输出结果和期望输出的误差来间接调整隐层的权值呢?BP算法就是采用这样的思想设计出来的算法,它的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。

    • 正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。
    • 反向传播时,将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。

    参考链接:https://blog.csdn.net/u013007900/article/details/50118945

     

    关于神经网络的原理介绍,这里有份赵春江的《机器学习经典算法剖析基于OpenCV》相关内容截图:

    四、MLP在OpenCV中的实现

    1、数据准备

    //每个像素RGB的宽度(即每个样本的长度;这里将一个像素作为一个像本)
    const int pixelsLen = 3;
    //物料只分1类(通过标签 1、-1 来区分透明和浅黄)
    const int materielTypeSum = 1;
    
    //每类物料共有像素个数
    const int materielsSum = 3000;
    
    //样本的总数量【每行为一个像本】
    const int dataHeight = materielTypeSum * materielsSum;
    
    //每一行一个像素
    float trainingData[dataHeight][pixelsLen] = { {0} };
    //训练样本标签
    float labels[dataHeight][materielTypeSum] = { {0} };
    
    //训练样本数据 及 对应标签
    Mat trainingDataMat(dataHeight, pixelsLen, CV_32FC1, trainingData);
    Mat labelsMat(dataHeight, materielTypeSum, CV_32FC1, labels);

    2、创建模型

    Ptr<ANN_MLP> model = ANN_MLP::create();

    3、神经网络层数设置

    Mat layerSizes = (Mat_<int>(1, 2) << pixelsLen, materielTypeSum);		//只有2层:输入层和输出层(未加入隐藏层),且输入为pixelsLen,输出为materielTypeSum
    model->setLayerSizes(layerSizes);			//创建层数

    4、训练方法

    model->setTrainMethod(ANN_MLP::BACKPROP, 0.001, 0.1);					//训练方法

    OpenCV里提供了两个方法一个是很经典的反向传播算法BACKPROP,另一个是弹性反馈算法RPROP,我使用的是BACKPROP。

    关于每种训练方法的相关参数,针对于反向传播法,主要是两个参数,一个是权值更新率bp_dw_scale和权值更新冲量bp_moment_scale。这两个量一般情况设置为0.1就行了;太小了网络收敛速度会很慢,太大了可能会让网络越过最小值点。

    5、激活函数

    model->setActivationFunction(ANN_MLP::SIGMOID_SYM, 1.0, 1.0);			//激活函数

    一般情况下我们用SIGMOID函数就可以了,当然你也可以选择正切函数或高斯函数作为激活函数。

    OpenCV3里提供了三种激活函数,线性函数(CvANN_MLP::IDENTITY)、sigmoid函数(CvANN_MLP::SIGMOID_SYM)和高斯激活函数(CvANN_MLP::GAUSSIAN)。且训练方法只有BACKPROP 和 RPROP。

    而OpenCV4中提供了5种激活方法 ,多了RELU 和 LEAKYRELU 。训练方法也多了一个ANNEAL。

    6、设置迭代终止准则

    model->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER | TermCriteria::EPS, 10000, 0.0001));		//设置迭代终止准则
    迭代次数设置成10000次

    7、训练

    Ptr<TrainData> trainData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);	//创建训练数据,ROW_SAMPLE表示data中每行为一个样本
    model->train(trainData);		//训练

    8、保存 

    //保存训练结果
    model->save("E:/vs2017Project/Number_MLP/Number_MLP/MLPModel.xml");

    9、输出参数

    //输出权重参数和偏置
    Mat outWeightMat = model->getWeights(1);
    cout << "type = " << outWeightMat.type() << endl;		//CV_64F(double类型)
    
    double *data1 = outWeightMat.ptr<double>(0);
    double *data2 = outWeightMat.ptr<double>(1);
    double *data3 = outWeightMat.ptr<double>(2);
    double *data4 = outWeightMat.ptr<double>(3);
    
    g_fWeightR = (float)*data1;
    g_fWeightG = (float)*data2;
    g_fWeightB = (float)*data3;
    g_fOffset = (float)*data4;

    可利用这些参数来计算并判断结果分类;

    10、预测

    Mat_<float> testMat(1, pixelsLen);
    testMat.at<float>(0, 0) = 172.0 / 255;
    testMat.at<float>(0, 1) = 186.0 / 255;
    testMat.at<float>(0, 2) = 212.0 / 255;
    //使用训练好的MLP model预测测试图像
    Mat result;
    model->predict(testMat, result);
    cout << "testMat: " << testMat << endl;
    
    float *p = result.ptr<float>(0);
    std::cout << "测试结果:" << *p << std::endl;

     

    参考链接:

    https://blog.csdn.net/akadiao/article/details/79236458

    https://blog.csdn.net/xiaowei_cqu/article/details/9027617

    OpenCV接口说明文档

    https://blog.csdn.net/qq_32768679/article/details/90027652

    https://blog.csdn.net/weixin_38206214/article/details/81137911

    https://www.cnblogs.com/xinxue/p/5789421.html

    展开全文
  • 神经网络多层感知机(MLP)

    千次阅读 2020-07-01 17:09:55
    多层感知机就是含有至少一个隐藏的由全连接组成的神经网络,且每个隐藏输出通过激活函数进行变换。 应用mxnet包我们可以很简单地实现MLP 代码 import d2lzh as d2l from mxnet import gluon, init ...
  • BP多层感知器 源代码 神经网络 tic; %计时开始 clc; %清屏 clear all; %清除所有变量 disp('输入神经元个数: 16'); %显示输入神经元个数 input=16; disp('中间神经元个数: 8'); %显示中间神经...
  • 多层感知器(MLP) Rosenblatt感知器和LMS算法,都是单层的并且是单个神经元构造的神经网络,...为了增加神经网络对这一类问题的泛化能力,出现了多层感知器(多层神经网络)的概念。 多层感知器基本特征: 网...
  • MLP多层感知机(人工神经网络)原理及代码实现

    万次阅读 多人点赞 2018-07-05 11:23:19
    一、多层感知机(MLP)原理简介多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构,如...
  • 神经网络-多层前馈神经网络

    千次阅读 2019-01-04 16:48:24
    神经网络-反向传播算法 神经网络-激活函数 神经网络是将许多个神经元按一定的层次结构连接起来的网络结构。不同的层次结构会产出不同类型神经网络,比如前馈神经网络和递归神经网络。 神经元 神经元是神经网络最...
  • 单层感知机与多层前馈神经网络

    千次阅读 2017-08-30 13:31:11
    单层感知机: ...从神经元细胞借鉴的‘门限’和‘权重和’的概念是建模的关键。 向量xw的点积--》海维赛德阶跃函数(作为激活函数)--》分类0,1 XW+b, b为偏好。如果b为负,样本X一定,为使结果仍为0.5,要
  • 多层感知机与神经网络学习总结

    千次阅读 2019-07-16 17:32:19
    这篇博客主要总结多层感知机(MLP)的一些知识要点,MLP也就是DNN(深度神经网络),是深度学习的基础。(原创 https://blog.csdn.net/baidu_33718858/article/details/84972537) 主要的参考文献来自于: ...
  • 今天要介绍的是常用的RBF神经网络学习算法及RBF神经网络多层感知器网络的对比。 一、RBF神经网络学习算法 广义的RBF神经网络结构如下图所示: N-M-L结构对应着N维输入,M个数据中心点centers,L个输出。 RBF ...
  • 1、径向基神经网络 径向基函数网络是由三层构成的前向网络:第一层为输入层,节点个数的能与输入的维数;第二层为隐含层,节点个数视问题的复杂度而定;第三层为输出层,节点个数等于输出数据的维数。 一般地,径向...
  • 概念理解 感知机 感知机(perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1...从神经网络模型的角度看,感知机是最简单的分类模型。 多层感知多层感知器(Multilayer P...
  • 继上文的集成学习模型之后,本文实践使用的pyspark提供的多层感知神经网络模型,这是一种比较简单但是却又很重要的神经网络模型。MLP是一种前向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP可以被...
  • 全连接网络(FC)、前馈神经网络(BP)、多层感知机(MLP)三种称呼实质是一样的。以全连接网络为例讲解训练过程。 全连接网络实际上可以看作由多个隐藏(dense)组成的网络模型,隐藏的每个节点都与上一所有...
  • MLPC(Multilayer Perceptron Classifier),多层感知器分类器,是一种基于前馈人工神经网络(ANN)的分类器。Spark中目前仅支持此种与神经网络有关的算法,在org.apache.spark.ml中(并非mllib)。本文通过代码来演示...
  • 一、多层神经网络 1、多层神经网络数学模型 2、数学模型中的非线性函数fai 1)非线性函数fai存在的意义 2)非线性函数fai具体是什么? 3、多层神经网络与单层神经网络的区别与改进 1)单层神经网络数学模型 2...
  • 介绍一个完完整整的,与我们实际使用一摸一样的多层感知机的反向传播方式 多层感知机MLP & 反向传播 2D函数优化实例
  • 多层感知机不等于神经网络

    千次阅读 2019-01-12 20:53:38
    只需给定合适的参数(w1, w2, b)并利用Python就可以简单实现对输入的任意(x1,x2),输出0或1。  今天我们将介绍感知机的局限性(严格说是单层感知机的局限性)。这里我们想用感知机实现异或门,所谓异...
  • 神经网络/多层感知器隐藏个数以及大小设置标准:隐藏个数: 一个零隐藏的模型可以解决线性可分数据。所以除非你早知道你的数据线性不可分,证明它也没什么坏处—为什么使用比任务需求更困难的模型。如果它是...
  • 前一篇文章中我们提到单层感知机网络被局限在解决传统的是非问题,当面对异或这类问题时则显得无能为力,为了解决这一问题,人们通过增加网络数来提升神经网络解决问题的能力。这就是我们今天要讲到的多层感知机...
  • 神经网络最左边的一层叫做输入层,包含3个输入单元,最右的一层叫做输出层。中间所有节点组成的一层叫做隐藏层,包含3个神经元。 前馈神经网络与反向传播算法请参考 Feedforward Neural Network手写数字识别MNIST数据...
  • 目录 0. 前言 1. 每一个神经元的组成 2. 梯度下降改善线性参数 3. 非线性激活函数 4. 输出单元 ...5. 神经网络宽度和深度的选择 ...如果这篇文章对你有一点...花书+吴恩达深度学习(一)前馈神经网络多层感知...
  • 多层感知

    千次阅读 2016-01-14 20:07:42
    1、单输出多层感知机 在单层感知机的基础上增加若干个(本文增加一个)隐,得到多层感知机(Multi Perceptron Machine,MLP)。结构如图所示: (单输出多层感知机) 图中各变量满足公式:
  • 所以才会有多层感知机的出现,它由一个输入,一个输入和多个隐藏组成。神经网络和前面介绍的感知机有很多共同点。这里,我们主要以两者 的差异为中心,来介绍神经网络的结构 。 在观察神经网络中信号的传递...
  • MLP(多层感知器)神经网络

    万次阅读 2017-06-08 20:05:07
    由前面介绍看到,单个感知器能够完成线性可分数据的分类问题,是一种最简单的可以“学习”的机器。但他无法解决非线性问题。比如下图中的XOR问题:即(1,1)(-1,-1)属于同一类,而(1,-1)(-1,1)属于第二类的...
  • 神经网络基础-多层感知器(MLP)

    千次阅读 2019-06-28 21:51:47
    DL教程http://study.163.com/courses-search?keyword=%E5%90%B4%E6%81%A9%E8%BE%BE#/?ot=5 原文:... 一、前言 多层感知器(Multi-Layer Perceptron,MLP)也叫人工神经网络(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,497
精华内容 8,198
关键字:

多层感知神经网络输出层