本文中作者為初學(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ī)遇。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4734瀏覽量
100420 -
javascript
+關(guān)注
關(guān)注
0文章
515瀏覽量
53756 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8353瀏覽量
132315
原文標(biāo)題:用JavaScript創(chuàng)建神經(jīng)網(wǎng)絡(luò)的有趣教程,一定要讓你知道!
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論