|
|
51CTO旗下网站
|
|
移步端
  • 副零开始构建简单人工神经网络:1个输入层和1个输出层

    资本上下篇将介绍仅使用numpy Python库从零开始构建人工神经网络(ANN)。上篇将介绍构建一个很简单的ANN,只有1个输入层和1个输出层,没有隐藏层。下篇将介绍构建一个有1个输入层、1个隐藏层和1个输出层的ANN。

    笔者:布加迪编译 来源:51CTO| 2020-03-25 09:00

    【51CTO.com快译】资本上下篇将介绍仅使用numpy Python库从零开始构建人工神经网络(ANN)。

    上篇将介绍构建一个很简单的ANN,只有1个输入层和1个输出层,没有隐藏层。

    下篇将介绍构建一个有1个输入层、1个隐藏层和1个输出层的ANN。

    为何从零初步?

    有成千上万深度学习库(Keras、TensorFlow和PyTorch等)可仅用几列代码构建一个神经网络。然而,如果你真想打听神经网络的底色运作,提议学习如何使用Python或其它其他编程语言从零开始为神经网络编程。

    不妨创建某个随机数据集:

    希冀1. 为简便起见,数据集带二进制值

    地方表格有五趟:Person、X1、X2、X3和Y。1表示true,0表示false。咱们的天职是创造一个能够基于X1、X2和X3的值来预测Y值的人为神经网络。

    咱们将创造一个有1个输入层、1个输出层而没有隐藏层的人为神经网络。起来编程前,先不妨看看我们的神经网络在理论上将如何实施:

    ANN辩论

    事在人为神经网络是一种监督式学习算法,这意味着我们为他提供含有自变量的涌入数据和含有因变量的进出口数据。比如在该示例中,自变量是X1、X2和X3,因变量是Y。

    第一,ANN拓展一些随机预测,名将这些预测与科学的进出口进行比较,计算出误差(展望值与现实值期间的差)。找出实际值与传播值期间的差别的函数名为成本函数(cost function)。此地的资金指误差。咱们的对象是使资金函数最小化。训练神经网络基本上是指使成本函数最小化。下会介绍如何实施此任务。

    神经网络分两个级次实施:明天馈阶段和反向传播阶段。下详细介绍这两个步骤。

    明天馈

    希冀2

    来源:另一方面层神经网络,又叫Perceptron

    在ANN的明天馈阶段,基于输入节点中的值和权重进行预测。如果看一下上图中的神经网络,会见到数据集中有三个性状:X1、X2和X3,因此第一层(又叫输入层)官方有三个重点。

    神经网络的权重基本上是咱们要调动之字符串,以便能够正确预测输出。请记住,每个输入特性只有一度权重。

    以下是在ANN的明天馈阶段所推行的步子:

    先后1地:计算输入和权重之间的线积

    步入层中的节点通过三个权重参数与出口层连接。在进出口层中,步入节点中的值与回报的权重相乘并相加。说到底,偏置项b补充到总和。

    为什么需要偏置项?

    假设某个人有输入值(0,0,0),步入节点和权重的差数之和将为零。在这种情况下,不论是我们怎么训练算法,进出口都将始终为零。故此,为了能够做到预测,即使我们没有关于该人的其他非零信息,也要求一个偏置项。偏置项对于构建稳健的神经网络而言必不可少。

    考古学上,点积的总额:

    X.W=x1.w1 + x2.w2 + x3.w3 + b

    先后2地:穿过激活函数传递点积(X.W)的总额

    点积XW可以变动任何一组值。然而在我们的进出口中,咱们有1和0花样的值。咱们盼望输出有同样的公式。故此,咱们需要一个激活函数(Activation Function),他将落入值限制在0到1之间。故此,咱们当然会使用Sigmoid激活函数。

    希冀3. Sigmoid激活函数

    步入为0时,Sigmoid函数返回0.5。如果输入是大正数,回到接近1的值。负输入的情况下,Sigmoid函数输出的值接近零。

    故此,他特别适用于我们要预测概率作为输出的模子。出于概念只存在于0到1之间,Sigmoid函数是适当我们这个题目的取舍。

    上图中z是点积X.W的总额。

    考古学上,Sigmoid激活函数是:

    希冀4. Sigmoid激活函数

    总结一下到当前结束所做的上班。第一,咱们要找到带权重的涌入特征(自变量矩阵)的线积。接着,穿过激活函数传递点积的总额。激活函数的结果基本上是考上特征的预测输出。

    反向传播

    一开始,拓展其它训练之前,神经网络进行随机预测,这种预测当然是不科学的。

    咱们先让网络做出随机输出预测。下一场,咱们将神经网络的预测输出与现实输出进行比较。然后,咱们更新权重和偏置,并确保预测输出更贴近实际输出。在这个阶段,咱们训练算法。不妨看一下反向传播阶段涉及的步子。

    先后1地:计算成本

    此阶段的首要步是找到预测成本。可以通过找到预测输出值和现实输出值期间的差来计算预测成本。如果差很大,本也将很大。

    咱们将采用均方误差即MSE本函数。本函数是找到给定输出预测成本的函数。

    希冀5. 平均方误差

    此地,Yi是现实输出值,Ŷi是展望输出值,n是观测次数。

    先后2地:使资金最小化

    咱们的最后目的是微调神经网络的权重,并行使资金最小化。如果你观察仔细,会了解到我们只能控制权重和偏置,其它任何不在控制范围之内。咱们无法控制输入,无法控制点积,无法控制Sigmoid函数。

    为了使资金最小化,咱们需要找到权重和偏置值,确保资金函数返回最小值。本越小,展望就越正确。

    要找到函数的最小值,咱们可以运用梯度下降算法。零度下降可以用经济学表示为:

    希冀6. 采用梯度下降更新权重

    𝛛Error是资金函数。地方的公式告诉我们找到关于每个权重和偏置的资金函数的偏导数,下一场从现有权重中裁减结果以得到新的权重。

    函数的导数给出了在其他给定点的通货膨胀率。为了找到成本是充实还是减少,给定权重值,咱们可以找到该特定权重值的函数导数。如果资金随重量增加而增加,导数将返回正值,下一场将他副现有值中裁减。

    一边,如果资金随重量增加而降低,名将返回负值,该值将把添加到现有的权重值中,因为负负得正。

    在地方公式中,a名为学习速率,乘以导数。读书速率决定了俺们的作法学习之进度。

    咱们需要对人权重和偏置重复执行梯度下降操作,直到成本最小化,并且成本函数返回的值接近零。

    如今是促成我们至今研究之人为神经网络的时节了。咱们将用Python创造一个简单的神经网络,有1个输入层和1个输出层。

    采用numpy贯彻人工神经网络

    希冀7

    图表来源:hackernoon.com

    要运用的步子:

    1.定义自变量和因变量

    2.定义超参数

    3.定义激活函数及其导数

    4.训练模型

    5.做到预测

    先后1地:先创建自变量或输入特征集以及相应的因变量或标签。

          
    1. #Independent variables  
    2. input_set = np.array([[0,1,0],  
    3. [0,0,1],  
    4. [1,0,0],  
    5. [1,1,0],  
    6. [1,1,1],  
    7. [0,1,1],  
    8. [0,1,0]])#Dependent variable  
    9. labels = np.array([[1,  
    10. 0,  
    11. 0,  
    12. 1,  
    13. 1,  
    14. 0,  
    15. 1]])  
    16. labels = labels.reshape(7,1) #to convert labels to vector 

    咱们的涌入集含有七个记录。同样,咱们还创办了一番标签集,含有输入集中每个记录的回应标签。标签是咱们盼望ANN展望的值。

    先后2地:定义超参数。

    咱们将使用numpy的random.seed函数,以便在推行以下代码时可以获得同样的随机值。

    然后,咱们采用正态分布的天文数字初始化权重。出于输入中有三个性状,故此我们有三个权重的发行量。下一场,咱们采用另一番指数初始化偏置值。说到底,咱们将学习速率设置为0.05。

          
    1. np.random.seed(42)  
    2. weights = np.random.rand(3,1)  
    3. bias = np.random.rand(1)  
    4. lr = 0.05 #learning rate 

    先后3地:定义激活函数及其导数:咱们的激活函数是Sigmoid函数。

          
    1. def sigmoid(x):  
    2. return 1/(1+np.exp(-x)) 

    如今定义计算Sigmoid函数导数的函数。

          
    1. def sigmoid_derivative(x):  
    2. return sigmoid(x)*(1-sigmoid(x)) 

    先后4地:是时刻训练ANN模型了。

    咱们将下定义轮次(epoch)多少开始。轮次是咱们想针对数据集训练算法的用户数。咱们将针对数据训练算法25000先后,故此epoch名将为25000。可以品尝不同之数字以进一步降低成本。

          
    1. for epoch in range(25000):  
    2. inputs = input_set  
    3. XW = np.dot(inputs, weights)+ bias  
    4. z = sigmoid(XW)  
    5. error = z - labels  
    6. print(error.sum())  
    7. dcost = error  
    8. dpred = sigmoid_derivative(z)  
    9. z_del = dcost * dpred  
    10. inputs = input_set.T  
    11. weights = weights - lr*np.dot(inputs, z_del)  
    12. for num in z_del:  
    13. bias = bias - lr*num 

    不妨了解每个步骤,下一场进入到预测的最终一地。

    咱们将落入input_set中的值存储到input增量中,以便在每次迭代中都保留input_set的值不变。

          
    1. inputs = input_set 

    然后,咱们找到输入和权重的线积,并为伊添加偏置。(明天馈阶段的程序1地)

          
    1. XW = np.dot(inputs, weights)+ bias 

    然后,咱们通过Sigmoid激活函数传递点积。(明天馈阶段的程序2地)

          
    1. z = sigmoid(XW) 

    这就完事了唯物辩证法的明天馈部分,如今是开端反向传播的时节了。

    增量z含有预测的进出口。反向传播的首要步是找到误差。

          
    1. error = z - labels  
    2. print(error.sum()) 

    咱们掌握成本函数是:

    希冀8

    咱们需要从每个权重方面求该函数的未知数,这可以运用微分链式法则(chain rule of differentiation)来轻松完成。我将跳过推导部分,但如果有人口感觉兴趣,请留言。

    故此,就任何权重而言,本函数的最后导数是:

          
    1. slope = input x dcost x dpred 

    如今,就业率可以简化为:

          
    1. dcost = error  
    2. dpred = sigmoid_derivative(z) 
    3. z_del = dcost * dpred  
    4. inputs = input_set.T  
    5. weights = weight-lr*np.dot(inputs, z_del) 

    咱们有z_del增量,含有dcost和dpred的差数。咱们拿输入特征矩阵的转置与z_del相乘,而不是遍历每个记录并拿输入与回报的z_del相乘。

    说到底,咱们将学习速率变量lr与导数相乘,以加快学习速度。

    除了更新权重外,咱们还要更新偏置项。

          
    1. for num in z_del:  
    2. bias = bias - lr*num 

    一旦循环开始,你会见到总误差开始回落;训练结束时,误区将保留为很小的值。

          
    1. -0.001415035616137969  
    2. -0.0014150128584959256  
    3. -0.0014149901015685952  
    4. -0.0014149673453557714  
    5. -0.0014149445898578358  
    6. -0.00141492183507419  
    7. -0.0014148990810050437  
    8. -0.0014148763276499686  
    9. -0.0014148535750089977  
    10. -0.0014148308230825385  
    11. -0.0014148080718707524  
    12. -0.0014147853213728624  
    13. -0.0014147625715897338  
    14. -0.0014147398225201734  
    15. -0.0014147170741648386  
    16. -0.001414694326523502  
    17. -0.001414671579597255  
    18. -0.0014146488333842064  
    19. -0.0014146260878853782  
    20. -0.0014146033431002465  
    21. -0.001414580599029179  
    22. -0.0014145578556723406  
    23. -0.0014145351130293877  
    24. -0.0014145123710998  
    25. -0.0014144896298846701  
    26. -0.0014144668893831067  
    27. -0.001414444149595611  
    28. -0.0014144214105213174  
    29. -0.0014143986721605849  
    30. -0.0014143759345140276  
    31. -0.0014143531975805163  
    32. -0.001414330461361444  
    33. -0.0014143077258557749  
    34. -0.0014142849910631708  
    35. -0.00141426225698401  
    36. -0.0014142395236186895  
    37. -0.0014142167909661323  
    38. -0.001414194059027955  
    39. -0.001414171327803089  
    40. -0.001414148597290995  
    41. -0.0014141258674925626  
    42. -0.0014141031384067547  
    43. -0.0014140804100348098  
    44. -0.0014140576823759854  
    45. -0.0014140349554301636  
    46. -0.0014140122291978665  
    47. -0.001413989503678362  
    48. -0.001413966778871751  
    49. -0.001413944054778446  
    50. -0.0014139213313983257  
    51. -0.0014138986087308195  
    52. -0.0014138758867765552  
    53. -0.0014138531655347973  
    54. -0.001413830445006264  
    55. -0.0014138077251906606  
    56. -0.001413785006087985  
    57. -0.0014137622876977014  
    58. -0.0014137395700206355  
    59. -0.0014137168530558228  
    60. -0.0014136941368045382  
    61. -0.0014136714212651114  
    62. -0.0014136487064390219  
    63. -0.0014136259923249635  
    64. -0.001413603278923519  
    65. -0.0014135805662344007  
    66. -0.0014135578542581566  
    67. -0.0014135351429944293  
    68. -0.0014135124324428719  
    69. -0.0014134897226037203  
    70. -0.0014134670134771238  
    71. -0.0014134443050626295  
    72. -0.0014134215973605428  
    73. -0.0014133988903706311 

    先后5地:做到预测

    是时刻作出部分预测了。先用[1,0,0]试一下:

          
    1. single_pt = np.array([1,0,0])  
    2. result = sigmoid(np.dot(single_pt, weights) + bias)  
    3. print(result) 

    进出口:

          
    1. [0.01031463] 

    如你所见,进出口更贴近0而不是1,故此分类为0。

    不妨再用[0,1,0]试一下:

          
    1. single_pt = np.array([0,1,0])  
    2. result = sigmoid(np.dot(single_pt, weights) + bias)  
    3. print(result)   

    进出口:

          
    1. [0.99440207] 

    如你所见,进出口更贴近1而不是0,故此分类为1。

    总结

    咱们在本文中学习了如何使用numpy Python库,副零开始创造一个很简单的人为神经网络,只有1个输入层和1个输出层。该ANN能够对线性可分离数据进行分类。

    如果我们有非线性可分离的多寡,咱们的ANN就无法对这种类型的多寡进行分类。下篇将介绍如何构建这样的ANN。

    原文标题:Build an Artificial Neural Network From Scratch: Part 1,笔者:Nagesh Singh Chauhan

    【51CTO来稿,合作站点转载请注明原文译者和出处为51CTO.com】

    【编纂推荐】

    1. 2020,AI艺术将会有哪些改变?
    2. 剖析和必发娱乐手机版正在推动物联网的上进
    3. 每秒处理240万帧游戏画面,AI训练成本降低80%,谷歌开源RL并行计算框架
    4. 书法之外:必发娱乐手机版和机器学习对集团的影响
    5. 必发娱乐手机版改变生活之10种方法
    【义务编辑: 庞桂玉 TEL:(010)68476606】

    点赞 0
  • 神经网络  AI  必发娱乐手机版
  • 分享:
    大家都在看
    猜你喜欢
  • 24H热文
    一周话题
    每月获赞
  • 2019深度学习框架排行榜 (副TOP 10到TOP 3)一文看懂NLP出生难在哪里副零开始构建简单人工神经网络:1个输入层和1个输出层如何开始采取必发娱乐手机版必发娱乐手机版改变生活之10种方法必发娱乐手机版与规划的前途关于必发娱乐手机版监控的影响,你应该知道的三件事2020 新的自动驾驶技术报告出炉!
  • 2019深度学习框架排行榜 (副TOP 10到TOP 3)其一B站up东道主太硬核!纯手工制作AI小电视:硬件自己焊代码全手写研究院全面总结 2019 年世界必发娱乐手机版发展:八大关键技术崛起,AI 渗透到更多领域互联网上20大免费数据科学、机器学习和必发娱乐手机版慕课必发娱乐手机版机器学习常用算法总结及各国常用算法精确率对比阿里达摩院突破自动驾驶技术问题:贯彻3D物体检测精度速度兼得未来学家预测2099年内的时尚名将发生之转移北京大学开源Jittor:首个国内高校自研深度学习框架,一键转换PyTorch
  • 2019深度学习框架排行榜 (副TOP 10到TOP 3)未来学家预测2099年内的时尚名将发生之转移快来!确立你的程序一个Python聊天机器人项目2020网络安全的引爆点:必发娱乐手机版2020年机器学习领域的五个潮流AIOps实行三板斧:副可视化、电气化到形象化加拿大神秘男子开发可自动去码AI,震动业界分享 | 必发娱乐手机版的12个突出案例
  • 订阅专栏+更多

     迅速无敌之 Gitlab CI 接轨集成

    迅速无敌之 Gitlab CI 接轨集成

    打破运维与科研壁垒
    共5章 | KaliArch

    74人口订阅学习

    秒杀高并发白话实战

    秒杀高并发白话实战

    主流高并发架构
    共15章 | 51CTO崔皓

    59人口订阅学习

    网络排障一点通

    网络排障一点通

    网络排障及优化调整案例
    共20章 | 捷哥CCIE

    465人口订阅学习

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微



  • <u id="b328b29d"></u>