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

简介: 自己搭建神经网络太复杂?别怕! 今天我们将手把手教你如何用30行代码轻松创建一个神经网络。 在本篇文章中,你将学到 如何使用Synaptic.js(https://synaptic.juancazala.com/#/ )创建和训练神经网络。


image


自己搭建神经网络太复杂?
image
别怕!

今天我们将手把手教你如何用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。箭头则代表的是神经元的突触,用来连接神经网络中其它层的神经元。


image


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

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

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

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


image

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

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

image


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

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

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

本教程不包括反向传播的工作原理介绍,但是我找到了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()函数来创建。函数中传递的数字表示的是每一层会有多少个神经元。


image

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

image


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


image

2.训练神经网络

image

我们共进行了20,000次的训练,每一次都进行四次正向传播和反向传播运算,分别传递四个可能的输入到神经网络:[0,0] [0,1] [1,0] [1,1] 。
我们从myNetwork.activate([0,0])激活函数开始,[0,0]是神经网络的输入值,这个过程是正向传播,也被称为激活网络。在每一次正向传播后我们需要做一次反向传播,从而更新神经网络的权重和偏差值。

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

myNetwork.propagate(learningRate, [0])

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

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

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

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

image

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

image


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

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

最后,当你学了新知识的时候,一定要去进行分享,比如创建一个Scrimba(https://scrimba.com/ )的屏幕录像或者写一篇文章!

来源:https://medium.freecodecamp.org/how-to-create-a-neural-network-in-javascript-in-only-30-lines-of-code-343dafc50d49

原文发布时间为:2017-09-14
作者:Per Harald Borgen
编译:高宁,Saint,钱天培
本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“大数据文摘”微信公众号

相关文章
|
29天前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
53 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
1月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
123 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
1月前
|
人工智能 JavaScript 前端开发
一段 JavaScript 代码,集成网站AI语音助手
根据本教程,只需通过白屏化的界面操作,即可快速构建一个专属的AI智能体。
|
2月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
147 15
在 golang 中执行 javascript 代码的方案详解
|
3月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
3月前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
83 3
|
3月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这些工具,可以确保代码风格一致,提高代码质量和可读性。
416 1
|
3月前
|
数据采集 JavaScript 前端开发
JavaScript重定向对网络爬虫的影响及处理
JavaScript重定向对网络爬虫的影响及处理
|
3月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
784 4

热门文章

最新文章