0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用JavaScript來搭建一個神經(jīng)網(wǎng)絡(luò)

電子工程師 ? 來源:未知 ? 作者:李倩 ? 2018-09-03 08:51 ? 次閱讀

本文中作者為初學(xué)者解釋了如何使用 JavaScript 來搭建一個神經(jīng)網(wǎng)絡(luò)。不用擔(dān)心,這不是一份深入介紹隱藏輸入層、激勵函數(shù)或如何使用 TensorFlow 的復(fù)雜教程,而是一次輕松實踐。即使你不懂神經(jīng)網(wǎng)絡(luò)背后的深入內(nèi)容,也可以完成這個簡單又有趣的實踐。

前言

機(jī)器學(xué)習(xí)對我來說是個特別的存在,讓我一次又一次覺得,“它實在太酷了,但我不確定接下來我是否會花幾個月的時間去學(xué)習(xí)線性代數(shù)和微積分。”

然而,同許多開發(fā)者一樣,我使用 JavaScript 比較得心應(yīng)手,也會偶爾找一些用 JS 實現(xiàn)機(jī)器學(xué)習(xí)的例子,但卻看到大量文章和帖子控訴 JS 對機(jī)器學(xué)習(xí)來說是極其糟糕的語言,這也是不得不承認(rèn)的一個事實。

但后來當(dāng)我發(fā)現(xiàn) Brain.js 時,我被打動了。為什么它被人忽略了這么久?!Brain.js 的文檔寫得非常清楚,而且易于學(xué)習(xí)。用了30分鐘的入門時間,然后我就搭建并訓(xùn)練了一個神經(jīng)網(wǎng)絡(luò)。如果你想直接去 Github 閱讀文檔,我們在文末給出了地址。

初體驗

關(guān)于接下來工作的主要步驟包括:

創(chuàng)建初始文件

確定你想讓神經(jīng)網(wǎng)絡(luò)做的工作

搭建 Brain.js 并考慮好如何處理訓(xùn)練數(shù)據(jù)和用戶輸入

收集訓(xùn)練數(shù)據(jù)

運(yùn)行神經(jīng)網(wǎng)絡(luò)

評估結(jié)果

▌1.初始文件

創(chuàng)建一個新的目錄,然后添加一個 index.html 作為樣板文件。接下來創(chuàng)建三個 JS 文件:brain.js、training-data.js 和 script.js,當(dāng)然,index.html 文件下面也需要引入這三個文件。

目前做這么多就足夠了。

現(xiàn)在我們來看看 Brain.js 的源代碼。將所有代碼復(fù)制并粘貼到你創(chuàng)建的空白 brain.js 文件中,然后點擊保存:4個文件中的2個就這樣完成了。

Brain.js 源代碼:

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

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

接下來這個部分很有趣:決定你的機(jī)器要學(xué)習(xí)什么。你可以用這種方式解決不計其數(shù)的實際問題,如情感分析或圖像識別。我偶然想到一個機(jī)器學(xué)習(xí)應(yīng)用,把文本作為輸入信息進(jìn)行處理是很有趣的,因為你能隨處找到可用作訓(xùn)練的數(shù)據(jù),它們有很多潛在的應(yīng)用場合,所以在這里我們要舉一個文本分類問題的例子:

判斷一條推文的作者是唐納德·特朗普還是金·卡戴珊。

這看起來可能不是個用處最廣的應(yīng)用。雖然推文作者識別器還沒有強(qiáng)大的吸引點,但 Twitter 對機(jī)器學(xué)習(xí)來說真的是一座寶庫。一旦進(jìn)行過訓(xùn)練,我們的神經(jīng)網(wǎng)絡(luò)就可以通過識別推文的內(nèi)容模式,來辨別一條此前從未見過的推文是出自唐納德·特朗普還是金·卡戴珊。為了實現(xiàn)這個目的,我們需要提供盡可能多的訓(xùn)練數(shù)據(jù),把它們復(fù)制并粘貼到我們的 training-data.js 文件中,同時我們也可以試試自己是否能判斷一些推文的原作者。

▌3.設(shè)置 & 數(shù)據(jù)處理

現(xiàn)在我們還需做的工作就是在 script.js 文件中設(shè)置 Brain.js,并為我們的 training-data.js 文件提供一些訓(xùn)練數(shù)據(jù)。但在此之前,讓我們先來看看這一切是如何運(yùn)作的。

設(shè)置 Brain.js 是極其簡單的,我們在這里不會花費(fèi)太多時間,但關(guān)于如何處理輸入數(shù)據(jù)格式的細(xì)節(jié)仍需要我們優(yōu)先處理。我們先看一下文檔中的例子,很清晰地展示了這一過程:

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});

首先,上面的例子是一個可以正常運(yùn)行的 AI(它會查看給定的顏色,然后告訴你在該顏色上黑色文本和白色文本哪個更易于辨認(rèn))。希望可以借此體現(xiàn) Brain.js 有多易于使用。我們只需先將它實例化,然后進(jìn)行訓(xùn)練,最后運(yùn)行,就是這么簡單。如果你將訓(xùn)練數(shù)據(jù)嵌入文件內(nèi)部,僅僅需要三行代碼,是不是很酷!

現(xiàn)在我們講一下數(shù)據(jù)的訓(xùn)練。在上面的例子中,除了訓(xùn)練數(shù)據(jù)的整體格式為input: {}, output: {},還有兩點需要注意。

第一,數(shù)據(jù)無需統(tǒng)一的長度。如上面代碼中的第11行,只傳入了 R 和 B 的值,而另兩條輸入傳入了 R、G 和 B 的值。同時,雖然上面的例子把對象作為輸入,值得一提的是你也可以使用數(shù)組。我之所以特別強(qiáng)調(diào)這一點,是因為我們會在該項目中傳入長度不等的數(shù)組。

第二,這些都不是有效的 RGB 值。如果你真的采用這些值,每一組都會呈現(xiàn)出黑色。這是因為要想讓 Brain.js 正常工作,輸入值必須在0和1之間。因此,為了能使其正常工作,每個顏色都需要進(jìn)行處理(只需用一個函數(shù)將它除以255,即 RGB 的最大值)。接下來我們也需要做類似的工作。

3.1 編碼

因此,如果我們想讓神經(jīng)網(wǎng)絡(luò)把推文(例如:字符串)作為輸入,我們需要用一個類似的函數(shù)將它們進(jìn)行處理(即下面提到的encode()方法),它會把每個字符轉(zhuǎn)化為0和1之間的值,并存入數(shù)組中。幸運(yùn)的是,JavaScript 有一個原生方法charCodeAt(),它可以將任何字符轉(zhuǎn)化成 ASCII 碼。所以我們會采取這種方式,把結(jié)果除以 EASCII 的最大值255,該操作可以保證我們得到的值均小于1。

3.2 處理訓(xùn)練數(shù)據(jù)

我們會將訓(xùn)練數(shù)據(jù)以純文本的形式進(jìn)行存儲,而最終喂給 AI 的數(shù)據(jù)是編碼后的數(shù)據(jù)。因此我們需要另一個函數(shù)(即下面所說的processTrainingData()方法),該函數(shù)會對我們的訓(xùn)練數(shù)據(jù)執(zhí)行上文提到的編碼處理,有選擇地將文本轉(zhuǎn)化成編碼字符,然后返回可以完美配合 Brain.js 的訓(xùn)練數(shù)據(jù)的數(shù)組。

那么到這兒的代碼如下(這部分代碼都將寫入 '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);

這里要強(qiáng)調(diào)一個上述文檔例子中未涉及的函數(shù),那就是train(),該函數(shù)可將訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)存入全局變量trainedNet 中。這一操作便于我們每次使用神經(jīng)網(wǎng)絡(luò)時無需重新訓(xùn)練。一旦神經(jīng)網(wǎng)絡(luò)被訓(xùn)練好并存入變量中,我們就可以像調(diào)用函數(shù)一樣直接調(diào)用網(wǎng)絡(luò),并將編碼后的數(shù)據(jù)傳入 AI 中(如上面execute() 函數(shù)中的第 45 行代碼)。

▌4.訓(xùn)練

最后就是有關(guān)我們的訓(xùn)練數(shù)據(jù)了。就像我在上面提到的,我們將推文存儲為文本的形式,然后緊接著把它們編碼成數(shù)值,這一操作可以讓你在復(fù)制粘貼訓(xùn)練數(shù)據(jù)時方便很多。無需擔(dān)心格式問題,直接在文本中粘貼新的一行就好了。

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]

把這段代碼寫進(jìn) 'training-data.js' 文件,我們就大功告成了!

注意:上面的代碼示例中,只展示了每個人的3條樣本,但實際上我分別引入了10條;我只是不想占用太多篇幅。當(dāng)然,你提供的訓(xùn)練數(shù)據(jù)量越大,神經(jīng)網(wǎng)絡(luò)的精度也會越高,所以試著改變引入的數(shù)據(jù)量,來看看對結(jié)果有哪些影響吧。

▌5.執(zhí)行

現(xiàn)在,就可以運(yùn)行這個訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)了。你只需在 'script.js' 文件的最下面加上一行調(diào)用execute() 的代碼,然后傳入一條特朗普或卡戴珊的推文;記得使用 console.log。這里有一則卡戴珊的推文,這條推文不在我的訓(xùn)練數(shù)據(jù)中:

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

接下來在本地打開你的 index.html 頁面,查看控制臺:

就是這樣,神經(jīng)網(wǎng)絡(luò)正確辨別了一條之前從未見過的、來自卡戴珊的推文,確定度達(dá)到了80%.

現(xiàn)在我們再用一條特朗普的推文試試:

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

結(jié)果如下:

▌6.評估

現(xiàn)在你已經(jīng)有一個可以訓(xùn)練任何文本的神經(jīng)網(wǎng)絡(luò)了!你可以使用它輕松辨別一封郵件或公司在線評價的情感及態(tài)度,識別垃圾郵件,將博客文章分類,判別一則消息是否緊急等等,這一點非常有趣,這個神經(jīng)網(wǎng)絡(luò)可以用在很多類似根據(jù)所寫內(nèi)容判斷作者的任務(wù)中。

即使你不想另外創(chuàng)建一個由機(jī)器學(xué)習(xí)驅(qū)動的全新工具,這次實踐對你來說也是一份寶貴的開發(fā)經(jīng)驗。也許什么時候它將會派上用場,甚至可能在未來為你開拓新的機(jī)遇。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標(biāo)題:用JavaScript創(chuàng)建神經(jīng)網(wǎng)絡(luò)的有趣教程,一定要讓你知道!

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    人工神經(jīng)網(wǎng)絡(luò)原理及下載

    這個網(wǎng)絡(luò)輸入和相應(yīng)的輸出來“訓(xùn)練”這個網(wǎng)絡(luò),網(wǎng)絡(luò)根據(jù)輸入和輸出不斷地調(diào)節(jié)自己的各節(jié)點之間的權(quán)值滿足輸入和輸出。這樣,當(dāng)訓(xùn)練結(jié)束后,我們給定
    發(fā)表于 06-19 14:40

    【PYNQ-Z2試用體驗】神經(jīng)網(wǎng)絡(luò)基礎(chǔ)知識

    神經(jīng)網(wǎng)絡(luò)的計算。對于多層多節(jié)點的神經(jīng)網(wǎng)絡(luò),我們可以使用矩陣乘法表示。在上面的神經(jīng)網(wǎng)絡(luò)中,我們將權(quán)重作為
    發(fā)表于 03-03 22:10

    【案例分享】ART神經(jīng)網(wǎng)絡(luò)與SOM神經(jīng)網(wǎng)絡(luò)

    今天學(xué)習(xí)了兩神經(jīng)網(wǎng)絡(luò),分別是自適應(yīng)諧振(ART)神經(jīng)網(wǎng)絡(luò)與自組織映射(SOM)神經(jīng)網(wǎng)絡(luò)。整體感覺不是很難,只不過些最基礎(chǔ)的概念容易理解不
    發(fā)表于 07-21 04:30

    如何構(gòu)建神經(jīng)網(wǎng)絡(luò)?

    原文鏈接:http://tecdat.cn/?p=5725 神經(jīng)網(wǎng)絡(luò)種基于現(xiàn)有數(shù)據(jù)創(chuàng)建預(yù)測的計算系統(tǒng)。如何構(gòu)建神經(jīng)網(wǎng)絡(luò)?神經(jīng)網(wǎng)絡(luò)包括:輸入層:根據(jù)現(xiàn)有數(shù)據(jù)獲取輸入的層隱藏層:使用反
    發(fā)表于 07-12 08:02

    基于BP神經(jīng)網(wǎng)絡(luò)的PID控制

    最近在學(xué)習(xí)電機(jī)的智能控制,上周學(xué)習(xí)了基于單神經(jīng)元的PID控制,這周研究基于BP神經(jīng)網(wǎng)絡(luò)的PID控制。神經(jīng)網(wǎng)絡(luò)具有任意非線性表達(dá)能力,可以通過對系統(tǒng)性能的學(xué)習(xí)實現(xiàn)具有最佳組合的PID控
    發(fā)表于 09-07 07:43

    如何使用Keras框架搭建小型的神經(jīng)網(wǎng)絡(luò)多層感知器

    本文介紹了如何使用Keras框架,搭建小型的神經(jīng)網(wǎng)絡(luò)-多層感知器,并通過給定數(shù)據(jù)進(jìn)行計算訓(xùn)練,最好將訓(xùn)練得到的模型提取出參數(shù),放在51單片機(jī)上進(jìn)行運(yùn)行。
    發(fā)表于 11-22 07:00

    輕量化神經(jīng)網(wǎng)絡(luò)的相關(guān)資料下載

    視覺任務(wù)中,并取得了巨大成功。然而,由于存儲空間和功耗的限制,神經(jīng)網(wǎng)絡(luò)模型在嵌入式設(shè)備上的存儲與計算仍然是巨大的挑戰(zhàn)。前面幾篇介紹了如何在嵌入式AI芯片上部署神經(jīng)網(wǎng)絡(luò):【嵌入式AI
    發(fā)表于 12-14 07:35

    卷積神經(jīng)網(wǎng)絡(luò)維卷積的處理過程

    inference在設(shè)備端上做。嵌入式設(shè)備的特點是算力不強(qiáng)、memory小??梢酝ㄟ^對神經(jīng)網(wǎng)絡(luò)做量化降load和省memory,但有時可能memory還吃緊,就需要對神經(jīng)網(wǎng)絡(luò)在memory使用上做進(jìn)
    發(fā)表于 12-23 06:16

    JavaScript 實現(xiàn)神經(jīng)網(wǎng)絡(luò)應(yīng)用教程

    近日,來自德國的 Robin Wieruch 發(fā)布了系列使用 JavaScript 構(gòu)建機(jī)器學(xué)習(xí)的教程,本文將主要介紹使用 JavaScript 實現(xiàn)神經(jīng)網(wǎng)絡(luò)的方法。
    發(fā)表于 12-08 09:21 ?5801次閱讀

    如何使用numpy搭建卷積神經(jīng)網(wǎng)絡(luò)詳細(xì)方法和程序概述

    內(nèi)容將繼續(xù)秉承之前 DNN 的學(xué)習(xí)路線,在利用Tensorflow搭建神經(jīng)網(wǎng)絡(luò)之前,先嘗試?yán)胣umpy手動搭建卷積神經(jīng)網(wǎng)絡(luò),以期對卷積神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 10-20 10:55 ?6031次閱讀

    用Python從頭實現(xiàn)神經(jīng)網(wǎng)絡(luò)理解神經(jīng)網(wǎng)絡(luò)的原理1

    事情可能會讓初學(xué)者驚訝:神經(jīng)網(wǎng)絡(luò)模型并不復(fù)雜!『神經(jīng)網(wǎng)絡(luò)』這個詞讓人覺得很高大上,但實際上神經(jīng)網(wǎng)絡(luò)算法要比人們想象的簡單。 這篇文章完全是為新手準(zhǔn)備的。我們會通過用Pytho
    的頭像 發(fā)表于 02-27 15:05 ?651次閱讀
    用Python從頭實現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b><b class='flag-5'>來</b>理解<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的原理1

    用Python從頭實現(xiàn)神經(jīng)網(wǎng)絡(luò)理解神經(jīng)網(wǎng)絡(luò)的原理2

    事情可能會讓初學(xué)者驚訝:神經(jīng)網(wǎng)絡(luò)模型并不復(fù)雜!『神經(jīng)網(wǎng)絡(luò)』這個詞讓人覺得很高大上,但實際上神經(jīng)網(wǎng)絡(luò)算法要比人們想象的簡單。 這篇文章完全是為新手準(zhǔn)備的。我們會通過用Pytho
    的頭像 發(fā)表于 02-27 15:06 ?586次閱讀
    用Python從頭實現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b><b class='flag-5'>來</b>理解<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的原理2

    用Python從頭實現(xiàn)神經(jīng)網(wǎng)絡(luò)理解神經(jīng)網(wǎng)絡(luò)的原理3

    事情可能會讓初學(xué)者驚訝:神經(jīng)網(wǎng)絡(luò)模型并不復(fù)雜!『神經(jīng)網(wǎng)絡(luò)』這個詞讓人覺得很高大上,但實際上神經(jīng)網(wǎng)絡(luò)算法要比人們想象的簡單。 這篇文章完全是為新手準(zhǔn)備的。我們會通過用Pytho
    的頭像 發(fā)表于 02-27 15:06 ?688次閱讀
    用Python從頭實現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b><b class='flag-5'>來</b>理解<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的原理3

    用Python從頭實現(xiàn)神經(jīng)網(wǎng)絡(luò)理解神經(jīng)網(wǎng)絡(luò)的原理4

    事情可能會讓初學(xué)者驚訝:神經(jīng)網(wǎng)絡(luò)模型并不復(fù)雜!『神經(jīng)網(wǎng)絡(luò)』這個詞讓人覺得很高大上,但實際上神經(jīng)網(wǎng)絡(luò)算法要比人們想象的簡單。 這篇文章完全是為新手準(zhǔn)備的。我們會通過用Pytho
    的頭像 發(fā)表于 02-27 15:06 ?654次閱讀
    用Python從頭實現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b><b class='flag-5'>來</b>理解<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的原理4

    卷積神經(jīng)網(wǎng)絡(luò)模型搭建

    卷積神經(jīng)網(wǎng)絡(luò)模型搭建 卷積神經(jīng)網(wǎng)絡(luò)模型是種深度學(xué)習(xí)算法。它已經(jīng)成為了計算機(jī)視覺和自然語言處理等各種領(lǐng)域的主流算法,具有很大的應(yīng)用前景。本篇文章將詳細(xì)介紹卷積
    的頭像 發(fā)表于 08-21 17:11 ?912次閱讀