大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我们将在Python中创建一个NeuralNetwork类,以训练神经元以给出准确的预测。该课程还将具有其他帮助程序功能。
我们拥有十年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都网站建设、网站设计、微信开发、重庆小程序开发公司、手机网站制作设计、HTML5建站、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。
1. 应用Sigmoid函数
我们将使用 Sigmoid函数 (它绘制一条“ S”形曲线)作为神经网络的激活函数。
2. 训练模型
这是我们将教神经网络做出准确预测的阶段。每个输入将具有权重(正或负)。
这意味着具有大量正权重或大量负权重的输入将对结果输出产生更大的影响。
我们最初是将每个权重分配给一个随机数。
本文参考翻译于此网站 —— 原文
File "C:\Python33\lib\trml2pdf.py", line 319
raise ValueError, "Not enough space"
错误在这里,值错误,返回原因空间不够
因为sigmoid就是预测0到1之间的连续值。通常当二分类预测使用,你的问题是否复合二分类如果可以就把类别换成0和1就可以了,如果是做回归那就不行了,要换其他损失函数
在神经网络中,激活函数负责将来自节点的加权输入转换为该输入的节点或输出的激活。ReLU 是一个分段线性函数,如果输入为正,它将直接输出,否则,它将输出为零。它已经成为许多类型神经网络的默认激活函数,因为使用它的模型更容易训练,并且通常能够获得更好的性能。在本文中,我们来详细介绍一下ReLU,主要分成以下几个部分:
1、Sigmoid 和 Tanh 激活函数的局限性
2、ReLU(Rectified Linear Activation Function)
3、如何实现ReLU
4、ReLU的优点
5、使用ReLU的技巧
一个神经网络由层节点组成,并学习将输入的样本映射到输出。对于给定的节点,将输入乘以节点中的权重,并将其相加。此值称为节点的summed activation。然后,经过求和的激活通过一个激活函数转换并定义特定的输出或节点的“activation”。
最简单的激活函数被称为线性激活,其中根本没有应用任何转换。 一个仅由线性激活函数组成的网络很容易训练,但不能学习复杂的映射函数。线性激活函数仍然用于预测一个数量的网络的输出层(例如回归问题)。
非线性激活函数是更好的,因为它们允许节点在数据中学习更复杂的结构 。两个广泛使用的非线性激活函数是 sigmoid 函数和 双曲正切 激活函数。
Sigmoid 激活函数 ,也被称为 Logistic函数神经网络,传统上是一个非常受欢迎的神经网络激活函数。函数的输入被转换成介于0.0和1.0之间的值。大于1.0的输入被转换为值1.0,同样,小于0.0的值被折断为0.0。所有可能的输入函数的形状都是从0到0.5到1.0的 s 形。在很长一段时间里,直到20世纪90年代早期,这是神经网络的默认激活方式。
双曲正切函数 ,简称 tanh,是一个形状类似的非线性激活函数,输出值介于-1.0和1.0之间。在20世纪90年代后期和21世纪初期,由于使用 tanh 函数的模型更容易训练,而且往往具有更好的预测性能,因此 tanh 函数比 Sigmoid激活函数更受青睐。
Sigmoid和 tanh 函数的一个普遍问题是它们值域饱和了 。这意味着,大值突然变为1.0,小值突然变为 -1或0。此外,函数只对其输入中间点周围的变化非常敏感。
无论作为输入的节点所提供的求和激活是否包含有用信息,函数的灵敏度和饱和度都是有限的。一旦达到饱和状态,学习算法就需要不断调整权值以提高模型的性能。
最后,随着硬件能力的提高,通过 gpu 的非常深的神经网络使用Sigmoid 和 tanh 激活函数不容易训练。在大型网络深层使用这些非线性激活函数不能接收有用的梯度信息。错误通过网络传播回来,并用于更新权重。每增加一层,错误数量就会大大减少。这就是所谓的 消失梯度 问题,它能有效地阻止深层(多层)网络的学习。
虽然非线性激活函数的使用允许神经网络学习复杂的映射函数,但它们有效地阻止了学习算法与深度网络的工作。在2000年代后期和2010年代初期,通过使用诸如波尔兹曼机器和分层训练或无监督的预训练等替代网络类型,这才找到了解决办法。
为了训练深层神经网络, 需要一个激活函数神经网络,它看起来和行为都像一个线性函数,但实际上是一个非线性函数,允许学习数据中的复杂关系 。该函数还必须提供更灵敏的激活和输入,避免饱和。
因此,ReLU出现了, 采用 ReLU 可以是深度学习革命中为数不多的里程碑之一 。ReLU激活函数是一个简单的计算,如果输入大于0,直接返回作为输入提供的值;如果输入是0或更小,返回值0。
我们可以用一个简单的 if-statement 来描述这个问题,如下所示:
对于大于零的值,这个函数是线性的,这意味着当使用反向传播训练神经网络时,它具有很多线性激活函数的理想特性。然而,它是一个非线性函数,因为负值总是作为零输出。由于矫正函数在输入域的一半是线性的,另一半是非线性的,所以它被称为 分段线性函数(piecewise linear function ) 。
我们可以很容易地在 Python 中实现ReLU激活函数。
我们希望任何正值都能不变地返回,而0.0或负值的输入值将作为0.0返回。
下面是一些修正的线性激活函数的输入和输出的例子:
输出如下:
我们可以通过绘制一系列的输入和计算出的输出,得到函数的输入和输出之间的关系。下面的示例生成一系列从 -10到10的整数,并计算每个输入的校正线性激活,然后绘制结果。
运行这个例子会创建一个图,显示所有负值和零输入都突变为0.0,而正输出则返回原样:
ReLU函数的导数是斜率。负值的斜率为0.0,正值的斜率为1.0。
传统上,神经网络领域已经不能是任何不完全可微的激活函数,而ReLU是一个分段函数。从技术上讲,当输入为0.0时,我们不能计算ReLU的导数,但是,我们可以假设它为0。
tanh 和 sigmoid 激活函数需要使用指数计算, 而ReLU只需要max(),因此他 计算上更简单,计算成本也更低 。
ReLU的一个重要好处是,它能够输出一个真正的零值 。这与 tanh 和 sigmoid 激活函数不同,后者学习近似于零输出,例如一个非常接近于零的值,但不是真正的零值。这意味着负输入可以输出真零值,允许神经网络中的隐层激活包含一个或多个真零值。这就是所谓的稀疏表示,是一个理想的性质,在表示学习,因为它可以加速学习和简化模型。
ReLU看起来更像一个线性函数,一般来说,当神经网络的行为是线性或接近线性时,它更容易优化 。
这个特性的关键在于,使用这个激活函数进行训练的网络几乎完全避免了梯度消失的问题,因为梯度仍然与节点激活成正比。
ReLU的出现使得利用硬件的提升和使用反向传播成功训练具有非线性激活函数的深层多层网络成为可能 。
很长一段时间,默认的激活方式是Sigmoid激活函数。后来,Tanh成了激活函数。 对于现代的深度学习神经网络,默认的激活函数是ReLU激活函数 。
ReLU 可以用于大多数类型的神经网络, 它通常作为多层感知机神经网络和卷积神经网络的激活函数 ,并且也得到了许多论文的证实。传统上,LSTMs 使用 tanh 激活函数来激活cell状态,使用 Sigmoid激活函数作为node输出。 而ReLU通常不适合RNN类型网络的使用。
偏置是节点上具有固定值的输入,这种偏置会影响激活函数的偏移,传统的做法是将偏置输入值设置为1.0。当在网络中使用 ReLU 时, 可以将偏差设置为一个小值,例如0.1 。
在训练神经网络之前,网络的权值必须初始化为小的随机值。当在网络中使用 ReLU 并将权重初始化为以零为中心的小型随机值时,默认情况下,网络中一半的单元将输出零值。有许多启发式方法来初始化神经网络的权值,但是没有最佳权值初始化方案。 何恺明的文章指出Xavier 初始化和其他方案不适合于 ReLU ,对 Xavier 初始化进行一个小的修改,使其适合于 ReLU,提出He Weight Initialization,这个方法更适用于ReLU 。
在使用神经网络之前对输入数据进行缩放是一个很好的做法。这可能涉及标准化变量,使其具有零均值和单位方差,或者将每个值归一化为0到1。如果不对许多问题进行数据缩放,神经网络的权重可能会增大,从而使网络不稳定并增加泛化误差。 无论是否在网络中使用 ReLU,这种缩放输入的良好实践都适用。
ReLU 的输出在正域上是无界的。这意味着在某些情况下,输出可以继续增长。因此,使用某种形式的权重正则化可能是一个比较好的方法,比如 l1或 l2向量范数。 这对于提高模型的稀疏表示(例如使用 l 1正则化)和降低泛化误差都是一个很好的方法 。
.
作者 | Vihar Kurama
编译 | 荷叶
来源 | 云栖社区
摘要:深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。本文就用一个小例子无死角的介绍一下深度学习!
人脑模拟
深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。此观点引出了“神经网络”这一术语。人脑中包含数十亿个神经元,它们之间有数万个连接。很多情况下,深度学习算法和人脑相似,因为人脑和深度学习模型都拥有大量的编译单元(神经元),这些编译单元(神经元)在独立的情况下都不太智能,但是当他们相互作用时就会变得智能。
我认为人们需要了解到深度学习正在使得很多幕后的事物变得更好。深度学习已经应用于谷歌搜索和图像搜索,你可以通过它搜索像“拥抱”这样的词语以获得相应的图像。-杰弗里·辛顿
神经元
神经网络的基本构建模块是人工神经元,它模仿了人类大脑的神经元。这些神经元是简单、强大的计算单元,拥有加权输入信号并且使用激活函数产生输出信号。这些神经元分布在神经网络的几个层中。
inputs 输入 outputs 输出 weights 权值 activation 激活
人工神经网络的工作原理是什么?
深度学习由人工神经网络构成,该网络模拟了人脑中类似的网络。当数据穿过这个人工网络时,每一层都会处理这个数据的一方面,过滤掉异常值,辨认出熟悉的实体,并产生最终输出。
输入层:该层由神经元组成,这些神经元只接收输入信息并将它传递到其他层。输入层的图层数应等于数据集里的属性或要素的数量。输出层:输出层具有预测性,其主要取决于你所构建的模型类型。隐含层:隐含层处于输入层和输出层之间,以模型类型为基础。隐含层包含大量的神经元。处于隐含层的神经元会先转化输入信息,再将它们传递出去。随着网络受训练,权重得到更新,从而使其更具前瞻性。
神经元的权重
权重是指两个神经元之间的连接的强度或幅度。你如果熟悉线性回归的话,可以将输入的权重类比为我们在回归方程中用的系数。权重通常被初始化为小的随机数值,比如数值0-1。
前馈深度网络
前馈监督神经网络曾是第一个也是最成功的学习算法。该网络也可被称为深度网络、多层感知机(MLP)或简单神经网络,并且阐明了具有单一隐含层的原始架构。每个神经元通过某个权重和另一个神经元相关联。
该网络处理向前处理输入信息,激活神经元,最终产生输出值。在此网络中,这称为前向传递。
inputlayer 输入层 hidden layer 输出层 output layer 输出层
激活函数
激活函数就是求和加权的输入到神经元的输出的映射。之所以称之为激活函数或传递函数是因为它控制着激活神经元的初始值和输出信号的强度。
用数学表示为:
我们有许多激活函数,其中使用最多的是整流线性单元函数、双曲正切函数和solfPlus函数。
激活函数的速查表如下:
反向传播
在网络中,我们将预测值与预期输出值相比较,并使用函数计算其误差。然后,这个误差会传回这个网络,每次传回一个层,权重也会根绝其导致的误差值进行更新。这个聪明的数学法是反向传播算法。这个步骤会在训练数据的所有样本中反复进行,整个训练数据集的网络更新一轮称为一个时期。一个网络可受训练数十、数百或数千个时期。
prediction error 预测误差
代价函数和梯度下降
代价函数度量了神经网络对给定的训练输入和预期输出“有多好”。该函数可能取决于权重、偏差等属性。
代价函数是单值的,并不是一个向量,因为它从整体上评估神经网络的性能。在运用梯度下降最优算法时,权重在每个时期后都会得到增量式地更新。
兼容代价函数
用数学表述为差值平方和:
target 目标值 output 输出值
权重更新的大小和方向是由在代价梯度的反向上采取步骤计算出的。
其中η 是学习率
其中Δw是包含每个权重系数w的权重更新的向量,其计算方式如下:
target 目标值 output 输出值
图表中会考虑到单系数的代价函数
initial weight 初始权重 gradient 梯度 global cost minimum 代价极小值
在导数达到最小误差值之前,我们会一直计算梯度下降,并且每个步骤都会取决于斜率(梯度)的陡度。
多层感知器(前向传播)
这类网络由多层神经元组成,通常这些神经元以前馈方式(向前传播)相互连接。一层中的每个神经元可以直接连接后续层的神经元。在许多应用中,这些网络的单元会采用S型函数或整流线性单元(整流线性激活)函数作为激活函数。
现在想想看要找出处理次数这个问题,给定的账户和家庭成员作为输入
要解决这个问题,首先,我们需要先创建一个前向传播神经网络。我们的输入层将是家庭成员和账户的数量,隐含层数为1, 输出层将是处理次数。
将图中输入层到输出层的给定权重作为输入:家庭成员数为2、账户数为3。
现在将通过以下步骤使用前向传播来计算隐含层(i,j)和输出层(k)的值。
步骤:
1, 乘法-添加方法。
2, 点积(输入*权重)。
3,一次一个数据点的前向传播。
4, 输出是该数据点的预测。
i的值将从相连接的神经元所对应的输入值和权重中计算出来。
i = (2 * 1) + (3* 1) → i = 5
同样地,j = (2 * -1) + (3 * 1) → j =1
K = (5 * 2) + (1* -1) → k = 9
Python中的多层感知器问题的解决
激活函数的使用
为了使神经网络达到其最大预测能力,我们需要在隐含层应用一个激活函数,以捕捉非线性。我们通过将值代入方程式的方式来在输入层和输出层应用激活函数。
这里我们使用整流线性激活(ReLU):
用Keras开发第一个神经网络
关于Keras:
Keras是一个高级神经网络的应用程序编程接口,由Python编写,能够搭建在TensorFlow,CNTK,或Theano上。
使用PIP在设备上安装Keras,并且运行下列指令。
在keras执行深度学习程序的步骤
1,加载数据;
2,创建模型;
3,编译模型;
4,拟合模型;
5,评估模型。
开发Keras模型
全连接层用Dense表示。我们可以指定层中神经元的数量作为第一参数,指定初始化方法为第二参数,即初始化参数,并且用激活参数确定激活函数。既然模型已经创建,我们就可以编译它。我们在底层库(也称为后端)用高效数字库编译模型,底层库可以用Theano或TensorFlow。目前为止,我们已经完成了创建模型和编译模型,为进行有效计算做好了准备。现在可以在PIMA数据上运行模型了。我们可以在模型上调用拟合函数f(),以在数据上训练或拟合模型。
我们先从KERAS中的程序开始,
神经网络一直训练到150个时期,并返回精确值。