0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用JavaScript来搭建一个神经网络

电子工程师 来源:未知 作者:李倩 2018-09-03 08:51 次阅读

本文中作者为初学者解释了如何使用 JavaScript 来搭建一个神经网络。不用担心,这不是一份深入介绍隐藏输入层、激励函数或如何使用 TensorFlow 的复杂教程,而是一次轻松实践。即使你不懂神经网络背后的深入内容,也可以完成这个简单又有趣的实践。

前言

机器学习对我来说是个特别的存在,让我一次又一次觉得,“它实在太酷了,但我不确定接下来我是否会花几个月的时间去学习线性代数和微积分。”

然而,同许多开发者一样,我使用 JavaScript 比较得心应手,也会偶尔找一些用 JS 实现机器学习的例子,但却看到大量文章和帖子控诉 JS 对机器学习来说是极其糟糕的语言,这也是不得不承认的一个事实。

但后来当我发现 Brain.js 时,我被打动了。为什么它被人忽略了这么久?!Brain.js 的文档写得非常清楚,而且易于学习。用了30分钟的入门时间,然后我就搭建并训练了一个神经网络。如果你想直接去 Github 阅读文档,我们在文末给出了地址。

初体验

关于接下来工作的主要步骤包括:

创建初始文件

确定你想让神经网络做的工作

搭建 Brain.js 并考虑好如何处理训练数据和用户输入

收集训练数据

运行神经网络

评估结果

▌1.初始文件

创建一个新的目录,然后添加一个 index.html 作为样板文件。接下来创建三个 JS 文件:brain.js、training-data.js 和 script.js,当然,index.html 文件下面也需要引入这三个文件。

目前做这么多就足够了。

现在我们来看看 Brain.js 的源代码。将所有代码复制并粘贴到你创建的空白 brain.js 文件中,然后点击保存:4个文件中的2个就这样完成了。

Brain.js 源代码:

https://raw.githubusercontent.com/harthur-org/brain.js/master/browser.js

▌2. “我的目的是什么?”

接下来这个部分很有趣:决定你的机器要学习什么。你可以用这种方式解决不计其数的实际问题,如情感分析或图像识别。我偶然想到一个机器学习应用,把文本作为输入信息进行处理是很有趣的,因为你能随处找到可用作训练的数据,它们有很多潜在的应用场合,所以在这里我们要举一个文本分类问题的例子:

判断一条推文的作者是唐纳德·特朗普还是金·卡戴珊。

这看起来可能不是个用处最广的应用。虽然推文作者识别器还没有强大的吸引点,但 Twitter 对机器学习来说真的是一座宝库。一旦进行过训练,我们的神经网络就可以通过识别推文的内容模式,来辨别一条此前从未见过的推文是出自唐纳德·特朗普还是金·卡戴珊。为了实现这个目的,我们需要提供尽可能多的训练数据,把它们复制并粘贴到我们的 training-data.js 文件中,同时我们也可以试试自己是否能判断一些推文的原作者。

▌3.设置 & 数据处理

现在我们还需做的工作就是在 script.js 文件中设置 Brain.js,并为我们的 training-data.js 文件提供一些训练数据。但在此之前,让我们先来看看这一切是如何运作的。

设置 Brain.js 是极其简单的,我们在这里不会花费太多时间,但关于如何处理输入数据格式的细节仍需要我们优先处理。我们先看一下文档中的例子,很清晰地展示了这一过程:

1letnet=newbrain.NeuralNetwork(); 2 3 4net.train([ 5 6{ 7 8Input:{r:0.03,g:0.7,b:0.5}, 910Output:{black:1}1112},{1314Input:{r:0.16,g:0.09,b:0.2},1516Output:{black:1}1718},{1920Input:{r:0.5,b:0.5},2122Output:{black:1}2324}2526]);27282930letoutput=net.run({r:1,g:0.4,b:0});

首先,上面的例子是一个可以正常运行的 AI(它会查看给定的颜色,然后告诉你在该颜色上黑色文本和白色文本哪个更易于辨认)。希望可以借此体现 Brain.js 有多易于使用。我们只需先将它实例化,然后进行训练,最后运行,就是这么简单。如果你将训练数据嵌入文件内部,仅仅需要三行代码,是不是很酷!

现在我们讲一下数据的训练。在上面的例子中,除了训练数据的整体格式为input: {}, output: {},还有两点需要注意。

第一,数据无需统一的长度。如上面代码中的第11行,只传入了 R 和 B 的值,而另两条输入传入了 R、G 和 B 的值。同时,虽然上面的例子把对象作为输入,值得一提的是你也可以使用数组。我之所以特别强调这一点,是因为我们会在该项目中传入长度不等的数组。

第二,这些都不是有效的 RGB 值。如果你真的采用这些值,每一组都会呈现出黑色。这是因为要想让 Brain.js 正常工作,输入值必须在0和1之间。因此,为了能使其正常工作,每个颜色都需要进行处理(只需用一个函数将它除以255,即 RGB 的最大值)。接下来我们也需要做类似的工作。

3.1 编码

因此,如果我们想让神经网络把推文(例如:字符串)作为输入,我们需要用一个类似的函数将它们进行处理(即下面提到的encode()方法),它会把每个字符转化为0和1之间的值,并存入数组中。幸运的是,JavaScript 有一个原生方法charCodeAt(),它可以将任何字符转化成 ASCII 码。所以我们会采取这种方式,把结果除以 EASCII 的最大值255,该操作可以保证我们得到的值均小于1。

3.2 处理训练数据

我们会将训练数据以纯文本的形式进行存储,而最终喂给 AI 的数据是编码后的数据。因此我们需要另一个函数(即下面所说的processTrainingData()方法),该函数会对我们的训练数据执行上文提到的编码处理,有选择地将文本转化成编码字符,然后返回可以完美配合 Brain.js 的训练数据的数组。

那么到这儿的代码如下(这部分代码都将写入 'script.js' 文件):

1lettrainedNet; 2 3 4 5functionencode(arg){ 6 7returnarg.split('').map(x=>(x.charCodeAt(0)/255)); 8 9}10111213functionprocessTrainingData(data){1415returndata.map(d=>{1617return{1819input:encode(d.input),2021output:d.output2223}2425})2627}28293031functiontrain(data){3233letnet=newbrain.NeuralNetwork();3435net.train(processTrainingData(data));3637trainedNet=net.toFunction();3839console.log('Finishedtraining...');4041};42434445functionexecute(input){4647letresults=trainedNet(encode(input));4849letoutput;5051results.trump>results.kardashian?output='Trump':output='Kardashian';5253returnoutput;5455}56575859train(trainingData);

这里要强调一个上述文档例子中未涉及的函数,那就是train(),该函数可将训练好的神经网络存入全局变量trainedNet 中。这一操作便于我们每次使用神经网络时无需重新训练。一旦神经网络被训练好并存入变量中,我们就可以像调用函数一样直接调用网络,并将编码后的数据传入 AI 中(如上面execute() 函数中的第 45 行代码)。

▌4.训练

最后就是有关我们的训练数据了。就像我在上面提到的,我们将推文存储为文本的形式,然后紧接着把它们编码成数值,这一操作可以让你在复制粘贴训练数据时方便很多。无需担心格式问题,直接在文本中粘贴新的一行就好了。

1consttrainingData=[ 2 3{ 4 5input:"InsideChi'snursery", 6 7output:{kardashian:1} 8 9},{1011input:"WhyIdyedmyhairpink",1213output:{kardashian:1}1415},{1617input:"FeelingBlue(wearing@kkwbeautypowdercontourinmedium&darkcontourkitaseyeshadow,&anewlipcomingsoon)",1819output:{kardashian:1}2021},{2223input:"Iwillbeinterviewedby@JudgeJeanineon@FoxNewsat9:00P.M.Enjoy!",2425output:{trump:1}2627},{2829input:"DemMemo:FBIdidnotdisclosewhotheclientswere-theClintonCampaignandtheDNC.Wow!",3031output:{trump:1}3233},{3435input:"ThankyoutothegreatmenandwomenoftheUnitedStates@SecretServiceforajobwelldone!",3637output:{trump:1}3839}4041]

把这段代码写进 'training-data.js' 文件,我们就大功告成了!

注意:上面的代码示例中,只展示了每个人的3条样本,但实际上我分别引入了10条;我只是不想占用太多篇幅。当然,你提供的训练数据量越大,神经网络的精度也会越高,所以试着改变引入的数据量,来看看对结果有哪些影响吧。

▌5.执行

现在,就可以运行这个训练好的神经网络了。你只需在 'script.js' 文件的最下面加上一行调用execute() 的代码,然后传入一条特朗普或卡戴珊的推文;记得使用 console.log。这里有一则卡戴珊的推文,这条推文不在我的训练数据中:

1console.log(execute("Thesearen'treal.KanyewouldneverwriteYeezyontheside"));

接下来在本地打开你的 index.html 页面,查看控制台:

就是这样,神经网络正确辨别了一条之前从未见过的、来自卡戴珊的推文,确定度达到了80%.

现在我们再用一条特朗普的推文试试:

1console.log(execute("WhetherweareRepublicanorDemocrat,wemustnowfocusonstrengtheningBackgroundChecks!"));

结果如下:

▌6.评估

现在你已经有一个可以训练任何文本的神经网络了!你可以使用它轻松辨别一封邮件或公司在线评价的情感及态度,识别垃圾邮件,将博客文章分类,判别一则消息是否紧急等等,这一点非常有趣,这个神经网络可以用在很多类似根据所写内容判断作者的任务中。

即使你不想另外创建一个由机器学习驱动的全新工具,这次实践对你来说也是一份宝贵的开发经验。也许什么时候它将会派上用场,甚至可能在未来为你开拓新的机遇。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4572

    浏览量

    98714
  • javascript
    +关注

    关注

    0

    文章

    511

    浏览量

    53402
  • 机器学习
    +关注

    关注

    66

    文章

    8116

    浏览量

    130546

原文标题:用JavaScript创建神经网络的有趣教程,一定要让你知道!

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    人工神经网络原理及下载

    这个网络输入和相应的输出来“训练”这个网络网络根据输入和输出不断地调节自己的各节点之间的权值满足输入和输出。这样,当训练结束后,我们给定
    发表于 06-19 14:40

    【PYNQ-Z2试用体验】神经网络基础知识

    神经网络的计算。对于多层多节点的神经网络,我们可以使用矩阵乘法表示。在上面的神经网络中,我们将权重作为
    发表于 03-03 22:10

    卷积神经网络如何使用

    卷积神经网络(CNN)究竟是什么,鉴于神经网络在工程上经历了曲折的历史,您为什么还会在意它呢? 对于这些非常中肯的问题,我们似乎可以给出相对简明的答案。
    发表于 07-17 07:21

    【案例分享】ART神经网络与SOM神经网络

    今天学习了两神经网络,分别是自适应谐振(ART)神经网络与自组织映射(SOM)神经网络。整体感觉不是很难,只不过些最基础的概念容易理解不
    发表于 07-21 04:30

    如何移植CNN神经网络到FPGA中?

    训练神经网络并移植到Lattice FPGA上,通常需要开发人员既要懂软件又要懂数字电路设计,是不容易的事。好在FPGA厂商为我们提供了许多工具和IP,我们可以在这些工具和IP的
    发表于 11-26 07:46

    如何构建神经网络

    原文链接:http://tecdat.cn/?p=5725 神经网络种基于现有数据创建预测的计算系统。如何构建神经网络神经网络包括:输入层:根据现有数据获取输入的层隐藏层:使用反
    发表于 07-12 08:02

    matlab实现神经网络 精选资料分享

    神经神经网络,对于神经网络的实现是如何直没有具体实现下:现看到
    发表于 08-18 07:25

    基于BP神经网络的PID控制

    最近在学习电机的智能控制,上周学习了基于单神经元的PID控制,这周研究基于BP神经网络的PID控制。神经网络具有任意非线性表达能力,可以通过对系统性能的学习实现具有最佳组合的PID控
    发表于 09-07 07:43

    如何使用Keras框架搭建小型的神经网络多层感知器

    本文介绍了如何使用Keras框架,搭建小型的神经网络-多层感知器,并通过给定数据进行计算训练,最好将训练得到的模型提取出参数,放在51单片机上进行运行。
    发表于 11-22 07:00

    轻量化神经网络的相关资料下载

    视觉任务中,并取得了巨大成功。然而,由于存储空间和功耗的限制,神经网络模型在嵌入式设备上的存储与计算仍然是巨大的挑战。前面几篇介绍了如何在嵌入式AI芯片上部署神经网络:【嵌入式AI
    发表于 12-14 07:35

    卷积神经网络维卷积的处理过程

    inference在设备端上做。嵌入式设备的特点是算力不强、memory小。可以通过对神经网络做量化降load和省memory,但有时可能memory还吃紧,就需要对神经网络在memory使用上做进
    发表于 12-23 06:16

    神经网络移植到STM32的方法

    神经网络移植到STM32最近在做的项目需要用到网络进行拟合,并且将拟合得到的结果用作控制,就在想能不能直接在单片机上做神经网络计算,这
    发表于 01-11 06:20

    卷积神经网络模型发展及应用

    卷积神经网络模型发展及应用转载****地址:http://fcst.ceaj.org/CN/abstract/abstract2521.shtml深度学习是机器学习和人工智能研究的最新趋势,作为
    发表于 08-02 10:39

    JavaScript 实现神经网络应用教程

    近日,来自德国的 Robin Wieruch 发布了一系列使用 JavaScript 构建机器学习的教程,本文将主要介绍使用 JavaScript 实现神经网络的方法。 JavaScript
    发表于 12-08 09:21 5641次阅读

    卷积神经网络模型搭建

    卷积神经网络模型搭建 卷积神经网络模型是一种深度学习算法。它已经成为了计算机视觉和自然语言处理等各种领域的主流算法,具有很大的应用前景。本篇文章将详细介绍卷积神经网络模型的
    的头像 发表于 08-21 17:11 610次阅读