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

简介:

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


自己搭建神经网络太复杂?

别怕!

今天我们将手把手教你如何用30行代码轻松创建一个神经网络

在本篇文章中,你将学到:

如何使用Synaptic.js(https://synaptic.juancazala.com/#/)创建和训练神经网络。

利用这款工具,我们可以在浏览器中用Node.js进行深度学习。

今天我们要讲的例子是一个非常简单的神经网络,我们将用它来学习逻辑异或方程(XOR equation)。

同时,我也在Scrimba上创建了一个交互式屏幕录像。你也可以通过观看视频来学习本教程。(https://scrimba.com/casts/cast-1980)

在开始编程之前,让我们先快速浏览神经网络的一些基本概念。

神经元和突触

神经网络的第一个模块,是神经元。

神经元类似一个函数,你输入一些值,它就会输出返回值。

神经元有各种不同的类型。我们的神经网络将用到sigmoid神经元(https://en.wikipedia.org/wiki/Sigmoid_function),将任何输入的给定值,压缩到0到1之间。

下图中的圆圈就代表一个sigmoid神经元。它的输入值是5,输出值是1。箭头则代表的是神经元的突触,用来连接神经网络中其它层的神经元。

为什么会有一个红色的数字5呢?它是连接到神经元的三个突触(左边3个箭头)的值之和。

在最左边,我们看到有两个值与所谓的偏差值进行了加法运算。数值1和0是绿色的,而偏差值-2是棕色的。

首先,两个输入值与他们的权重分别相乘,权重就是蓝色数字7和3。

然后,我们把他们和偏差值加起来,所得的结果是5,对应红色数字。这个红色数字就是我们人工神经元的输入值。

由于我们的神经元是sigmoid神经元,它会将任何值压缩到0到1的区间范围内,所以输出值被压缩到1。

如果将这些神经元的网络连接起来,就形成了一个神经网络。通过神经元间的突触连接,从输入到输出进行正向传播。如下图所示:

神经网络的目标是训练其泛化能力,例如识别手写的数字或者垃圾邮件。做到好的泛化重要的是通过神经网络找到合适的权重和偏差值。如上述例子中的蓝色和棕色数字。

当训练神经网络时,我们只需要加载大量示例数据,如手写的数字,然后让神经网络来预测正确的数字。

在每次预测后,你需要计算预测的偏差程度,然后调整权重和偏差值使得神经网络在下一次运算中可以预测的更加准确。这种学习过程被称为反向传播。如此重复上千次,你的神经网络很快会精于泛化。

本教程不包括反向传播的工作原理介绍,但是我找到了3个好的教程帮助大家理解:

  • 分步介绍反向传播案例(https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/) – 作者:Matt Mazur
  • 神经网路骇客指南(http://karpathy.github.io/neuralnets/) – 作者:Andrej Karpathy
  • 神经网络和深度学习(http://neuralnetworksanddeeplearning.com/chap1.html) – 作者:Michael Nielsen

用代码搭建神经网络

现在,你应该已经对神经网络有了基础概念,那就让我们进入代码部分吧。

1.创建神经网络层

在synaptic中我们使用new layer()函数来创建。函数中传递的数字表示的是每一层会有多少个神经元。

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

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

2.训练神经网络

我们共进行了20,000次的训练,每一次都进行四次正向传播和反向传播运算,分别传递四个可能的输入到神经网络:[0,0] [0,1] [1,0] [1,1] 。

我们从myNetwork.activate([0,0])激活函数开始,[0,0]是神经网络的输入值,这个过程是正向传播,也被称为激活网络。在每一次正向传播后我们需要做一次反向传播,从而更新神经网络的权重和偏差值。

反向传播通过下面这行代码实现

 
  1. myNetwork.propagate(learningRate, [0]) 

learningRate是一个常数,用来告诉神经网络每次应该对权重值进行多大程度的调整。第二个参数0表示的是当输入为[0,0]时,正确的输出参数是0.

然后,神经网络将预测值和真实值进行对比,来判断预测是否正确。

它将比较的结果作为调整权重和偏差值的基础,以便下次的预测可以更加准确。

在执行这个过程20,000次后,我们可以通过传递四个可能的输入到激活网络,从而判断目前神经网络的预测情况:

如果我们将这些值四舍五入到最近的整数,就将得到异或方程的正确结果。万岁!

以上就是教程的全部内容了。

虽然我们只了解了神经网络的皮毛,但这已经足够支持你开始使用Synaptic,并继续学习。另外,Synaptic的wiki中有很多好的教程,你可以点击以下链接浏览(https://github.com/cazala/synaptic/wiki)。


本文作者:代码小能手

来源:51CTO

相关文章
|
1天前
|
JavaScript
网站内容禁止复制的js代码
网站内容禁止复制的js代码
|
7天前
|
缓存 JavaScript 前端开发
js和html代码一定要分离吗
JavaScript(JS)和HTML代码的分离虽非绝对必要,但通常被推荐
|
10天前
|
移动开发 JavaScript 安全
总有一款适合您分享78个JS相册代码
本文分享了78款JS相册代码,包括3D相册旋转木马、图片悬浮效果、倾斜图片幻灯片切换等特效,适用于各种图片展示场景。无论您需要哪种样式,都能在这里找到满意的解决方案。快来挑选吧!参考链接:[点击这里](https://www.vipwb.com/sitemap.xml)。
23 4
|
11天前
|
JavaScript
分享一款520表白节JS代码
今天给大家分享一款JS表白源码 js会随 随机颜色心形跟随鼠标互动520表白节女神表白利器! 修改的话就搜索:LOVEh 就能找到这个英文了。
6 0
分享一款520表白节JS代码
|
18天前
|
JSON JavaScript 前端开发
如何使用代码注释:关于JavaScript与TypeScript
TSDoc是一种标准化TypeScript代码文档注释的规范,使不同工具能无干扰地提取内容。它包括多种标记,如@alpha、@beta等发布阶段标记;@decorator、@deprecated等功能标记;@defaultValue、@eventProperty等描述标记;@example、@experimental等示例与实验性标记;@inheritDoc、@internal等引用与内部标记;@label、@link等链接标记;@override、@sealed等修饰符标记;以及@packageDocumentation、@param、
25 5
|
16天前
|
Web App开发 JavaScript 前端开发
JavaScript基础知识-使用Firefox进行代码的调试(Debug)
关于如何使用Firefox浏览器进行JavaScript代码调试的基础知识介绍。
29 0
|
19天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
40 0
|
19天前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
43 0
|
19天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
42 0
|
19天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
30 0