首页 > 推荐 > 正文

手把手 | 30行JavaScript代码,教你分分钟创建神经网络

2017-09-15 09:50:20  来源:大数据文摘

摘要:今天我们将手把手教你如何用30行代码轻松创建一个神经网络。
关键词: JavaScript代码 神经网络
\

  今天我们将手把手教你如何用30行代码轻松创建一个神经网络。
 
  在本篇文章中,你将学到
 
  如何使用Synaptic.js创建和训练神经网络。
 
  利用这款工具,我们可以在浏览器中用Node.js进行深度学习。
 
  今天我们要讲的例子是一个非常简单的神经网络,我们将用它来学习逻辑异或方程(XOR equation)。
 
  同时,我也在Scrimba上创建了一个交互式屏幕录像。
 
  在开始编程之前,让我们先快速浏览神经网络的一些基本概念。
 
  神经元和突触
 
  神经网络的第一个模块,是神经元。
 
  神经元类似一个函数,你输入一些值,它就会输出返回值。
 
  神经元有各种不同的类型。我们的神经网络将用到sigmoid神经元,将任何输入的给定值,压缩到0到1之间。
 
  下图中的圆圈就代表一个sigmoid神经元。它的输入值是5,输出值是1。箭头则代表的是神经元的突触,用来连接神经网络中其它层的神经元。

\
 
  为什么会有一个红色的数字5呢?它是连接到神经元的三个突触(左边3个箭头)的值之和。
 
  在最左边,我们看到有两个值与所谓的偏差值进行了加法运算。数值1和0是绿色的,而偏差值-2是棕色的。
 
  首先,两个输入值与他们的权重分别相乘,权重就是蓝色数字7和3。
 
  然后,我们把他们和偏差值加起来,所得的结果是5,对应红色数字。这个红色数字就是我们人工神经元的输入值。

\
 
  由于我们的神经元是sigmoid神经元,它会将任何值压缩到0到1的区间范围内,所以输出值被压缩到1。
 
  如果将这些神经元的网络连接起来,就形成了一个神经网络。通过神经元间的突触连接,从输入到输出进行正向传播。如下图所示:

\
 
  神经网络的目标是训练其泛化能力,例如识别手写的数字或者垃圾邮件。做到好的泛化重要的是通过神经网络找到合适的权重和偏差值。如上述例子中的蓝色和棕色数字。
 
  当训练神经网络时,我们只需要加载大量示例数据,如手写的数字,然后让神经网络来预测正确的数字。
 
  在每次预测后,你需要计算预测的偏差程度,然后调整权重和偏差值使得神经网络在下一次运算中可以预测的更加准确。这种学习过程被称为反向传播。如此重复上千次,你的神经网络很快会精于泛化。
 
  用代码搭建神经网络
 
  现在,你应该已经对神经网络有了基础概念,那就让我们进入代码部分吧。
 
  1.创建神经网络层
 
  在synaptic中我们使用new layer()函数来创建。函数中传递的数字表示的是每一层会有多少个神经元。

\
 
  接下来我们将这些层进行连接并实例化一个神经网络,代码如下,

\
 
  这是一个2-3-1结构的神经网络,可视化表示如下:

\
 
  2.训练神经网络

\
 
  我们共进行了20,000次的训练,每一次都进行四次正向传播和反向传播运算,分别传递四个可能的输入到神经网络:[0,0] [0,1] [1,0] [1,1] 。
 
  我们从my Network.activate([0,0])激活函数开始,[0,0]是神经网络的输入值,这个过程是正向传播,也被称为激活网络。在每一次正向传播后我们需要做一次反向传播,从而更新神经网络的权重和偏差值。
 
  反向传播通过下面这行代码实现??
 
  myNetwork.propagate(learningRate, [0])
 
  learningRate是一个常数,用来告诉神经网络每次应该对权重值进行多大程度的调整。第二个参数0表示的是当输入为[0,0]时,正确的输出参数是0.
 
  然后,神经网络将预测值和真实值进行对比,来判断预测是否正确。
 
  它将比较的结果作为调整权重和偏差值的基础,以便下次的预测可以更加准确。
 
  在执行这个过程20,000次后,我们可以通过传递四个可能的输入到激活网络,从而判断目前神经网络的预测情况:

\
 
  如果我们将这些值四舍五入到最近的整数,就将得到异或方程的正确结果。万岁!
 
  以上就是教程的全部内容了。
 
  虽然我们只了解了神经网络的皮毛,但这已经足够支持你开始使用Synaptic,并继续学习。
 
  最后,当你学了新知识的时候,一定要去进行分享,比如创建一个Scrimba的屏幕录像或者写一篇文章!

第四十一届CIO班招生
国际CIO认证培训
首席数据官(CDO)认证培训
责编:houlimin

免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。