日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何在瀏覽器使用synaptic.js訓(xùn)練簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)推薦系統(tǒng)

本文利用 synaptic 庫構(gòu)建簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),并在瀏覽器中實(shí)現(xiàn)訓(xùn)練過程。該神經(jīng)網(wǎng)絡(luò)可以和其他框架共同打造一款簡(jiǎn)單的推薦系統(tǒng)應(yīng)用。這種在瀏覽器上訓(xùn)練的神經(jīng)網(wǎng)絡(luò)因?yàn)閷⒂?jì)算任務(wù)分配到各個(gè)終端設(shè)備,所以服務(wù)器的壓力大大降低。此外,在終端上訓(xùn)練的神經(jīng)網(wǎng)絡(luò)也大大保護(hù)了用戶的隱私。機(jī)器之心對(duì)本文做了簡(jiǎn)要介紹,全部代碼請(qǐng)查看 Github 項(xiàng)目地址。

為珠山等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及珠山網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、珠山網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

項(xiàng)目地址:https://github.com/markselby9/ml-in-browser

用 JS 進(jìn)行機(jī)器學(xué)習(xí)?為什么不呢!

一、項(xiàng)目概覽

我們將構(gòu)建一個(gè)基于人工神經(jīng)網(wǎng)絡(luò)的簡(jiǎn)單 Web 應(yīng)用程序推薦系統(tǒng)。該應(yīng)用程序包含兩頁,***頁顯示書籍,第二頁顯示電影。用戶可以在***頁中選擇他或她感興趣的書籍,當(dāng)他點(diǎn)擊下一頁按鈕時(shí),我們實(shí)際上可以在后臺(tái)預(yù)測(cè)他可能會(huì)感興趣的電影。在用戶選擇他喜歡的電影之后,我們會(huì)給用戶顯示他所選擇的結(jié)果,以及我們對(duì)他的選擇的預(yù)測(cè)。一些顯示截屏如下所示:

在***頁中選擇感興趣的書籍

在第二頁中選擇感興趣的電影

將選擇與預(yù)測(cè)結(jié)果進(jìn)行比較

這個(gè)應(yīng)用程序使用 Vue.js 和 ElementUI(Vue.js 的 UI 框架)構(gòu)建,并使用 synaptic 庫構(gòu)建神經(jīng)網(wǎng)絡(luò)。

有什么優(yōu)點(diǎn)?

該項(xiàng)目的優(yōu)勢(shì)可以歸結(jié)如下:

  • 我們將模型訓(xùn)練工作轉(zhuǎn)移到前端而不是后端,這不僅降低了服務(wù)器的壓力,同時(shí)還將一些計(jì)算任務(wù)分配給許多客戶端。由于 npm 社區(qū)提供許多神經(jīng)網(wǎng)絡(luò)相關(guān)的 Javascript 庫,這種方法是可行的。
  • 我們保護(hù)用戶的隱私。用戶的數(shù)據(jù)并沒有實(shí)際被上傳到服務(wù)器,當(dāng)服務(wù)器更新訓(xùn)練模型時(shí),他們的數(shù)據(jù)對(duì)于服務(wù)器是匿名的。

二、神經(jīng)網(wǎng)絡(luò)簡(jiǎn)要介紹

首先,這里使用的神經(jīng)網(wǎng)絡(luò)是最基礎(chǔ)的人工神經(jīng)網(wǎng)絡(luò),我們決定僅使用用戶的選擇作為輸入和輸出集。本節(jié)使用的圖像來自一個(gè)介紹神經(jīng)網(wǎng)絡(luò)的博客:

https://ujjwalkarn.me/2016/08/09/quick-intro-neural-networks/。

本項(xiàng)目涉及的概念包括:人工神經(jīng)網(wǎng)絡(luò)、神經(jīng)元、層次和訓(xùn)練(反向傳播)。如果你已經(jīng)熟悉這些概念,你可以跳過此部分。人工神經(jīng)網(wǎng)絡(luò)(ANN)是一種由人腦啟發(fā)的計(jì)算模型。它由神經(jīng)元組成,神經(jīng)元是神經(jīng)網(wǎng)絡(luò)的基本單元。神經(jīng)元從其它來源接收輸入,每個(gè)輸入分配一個(gè)權(quán)重,權(quán)重根據(jù)輸入的重要程度賦予。神經(jīng)元使用激活函數(shù)作用于所有輸入的加權(quán)之和,然后給出輸出。

神經(jīng)元

單層神經(jīng)網(wǎng)絡(luò)由幾個(gè)神經(jīng)元組成,如下圖所示。神經(jīng)網(wǎng)絡(luò)可以包含或可以不包含多個(gè)隱藏層,每對(duì)相鄰層之間具有連接,這種連接通常由前面提到的權(quán)重表示。

簡(jiǎn)單全連接神經(jīng)網(wǎng)絡(luò)的層級(jí)結(jié)構(gòu)

但是如何通過正確衡量這些權(quán)重來架構(gòu)神經(jīng)網(wǎng)絡(luò)呢?這些權(quán)重需要訓(xùn)練,來達(dá)到使神經(jīng)網(wǎng)絡(luò)正常工作的要求。假設(shè)我們有一個(gè)數(shù)據(jù)表,其中包含 1000 對(duì)輸入和相應(yīng)的輸出。我們首先產(chǎn)生 0 和 1 之間的隨機(jī)數(shù)給出所有權(quán)重,然后遍歷所有數(shù)據(jù)對(duì)。在每對(duì)輸入和輸出中,我們使用神經(jīng)網(wǎng)絡(luò)的激活函數(shù)給出計(jì)算結(jié)果,并將其與實(shí)際輸出進(jìn)行比較。然后我們使用反向傳播算法重新訓(xùn)練網(wǎng)絡(luò)并調(diào)整權(quán)重。更新反向傳播的權(quán)重可以通過隨機(jī)梯度下降來完成,這是一種獲得***權(quán)重值的方法。

這里只是簡(jiǎn)要介紹神經(jīng)網(wǎng)絡(luò)的原理。更詳細(xì)的內(nèi)容,請(qǐng)參考以下鏈接:

  • https://ujjwalkarn.me/2016/08/09/quick-intro-neural-networks/
  • https://en.wikipedia.org/wiki/Artificial_neural_network
  • https://github.com/cazala/synaptic/wiki/Neural-Networks-101

神經(jīng)網(wǎng)絡(luò)在瀏覽器中的實(shí)現(xiàn)

最近有一些在瀏覽器中實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的相關(guān)研究,如:

  • Deeplearnjs:https://github.com/PAIR-code/deeplearnjs
  • ConvnetJS:http://cs.stanford.edu/people/karpathy/convnetjs/
  • synaptic.js:http://caza.la/synaptic/

我們?cè)谶@里使用 synaptic.js,因?yàn)椴还軐?duì)于 node.js 還是瀏覽器,它都是一個(gè)無架構(gòu)的神經(jīng)網(wǎng)絡(luò)庫。我們可以通過 github 庫中的 wiki 來檢查文檔:

https://github.com/cazala/synaptic/wiki/Architect。我們計(jì)劃在瀏覽器中實(shí)現(xiàn)所有的神經(jīng)網(wǎng)絡(luò)訓(xùn)練和部分激活函數(shù),服務(wù)器(使用簡(jiǎn)單的 node.js 和 express 搭建服務(wù)器框架)只保留包含網(wǎng)絡(luò)參數(shù)的 JSON 文件。synaptic.js 有一個(gè)方便的 API 來將神經(jīng)網(wǎng)絡(luò)解析成 JSON,并將 JSON 解析為神經(jīng)網(wǎng)絡(luò)實(shí)例。

應(yīng)用程序由 Vue.js 和 ElementUI 構(gòu)建。在創(chuàng)建主應(yīng)用程序組件的生命周期中,應(yīng)用程序從服務(wù)器獲取模型的 JSON 文件,并基于 JSON 文件構(gòu)建神經(jīng)網(wǎng)絡(luò)實(shí)例。然后該模型展示 20 張含有電影信息的卡片,讓用戶選擇他/她感興趣的項(xiàng)目,用戶完成選擇并單擊下一步后,網(wǎng)絡(luò)實(shí)例將調(diào)用激活函數(shù),并給出該用戶可能想要的書籍的預(yù)測(cè)值(基于 20 種書籍選項(xiàng))。同時(shí),應(yīng)用程序還展示另外 20 張包含書籍信息的卡片,讓用戶選擇。用戶點(diǎn)擊提交按鈕后,應(yīng)用程序會(huì)將預(yù)測(cè)的書籍列表和實(shí)際的書籍列表呈現(xiàn)給用戶,并在后臺(tái)使用新的訓(xùn)練數(shù)據(jù)來反向傳播并重新訓(xùn)練模型。再次訓(xùn)練后,新的神經(jīng)網(wǎng)絡(luò)將被解析為 JSON 對(duì)象并發(fā)送回服務(wù)器。

下面是代碼。服務(wù)器利用簡(jiǎn)單的 node.js 中的 I/O API 和 Express 構(gòu)建。

 
 
 
 
  1. app.post('/getNetwork', (req, res) => {
  2.     if (req.body) {
  3.         console.log(req.body);
  4.         readJSONFromFile((network) => { // read local JSON file
  5.             res.send({
  6.                 code: 200,
  7.                 network,
  8.             });
  9.         }, (err) => {
  10.             console.log(err.toString());
  11.         });
  12.     }
  13. });
  14. app.post('/setNetwork', (req, res) => {
  15.     if (req.body && req.body.networkJSON) {
  16.         console.log(req.body);
  17.         const { networkJSON } = req.body;
  18.         saveJSONToFile(networkJSON, (err) => { // write to local JSON file
  19.             if (err) {
  20.                 res.send({
  21.                     code: 500,
  22.                     err
  23.                 });
  24.             } else {
  25.                 res.send({
  26.                     code: 200,
  27.                 });
  28.             }
  29.         });
  30.     } else {
  31.         res.send({
  32.             code: 406,
  33.         })
  34.     }
  35. });
  36. app.listen(3000, () => {
  37.     console.log('server started');
  38. });

以及在客戶端。在本文中我們不會(huì)介紹 DOM 的細(xì)節(jié),我們將僅關(guān)注組件 app.vue 下的腳本部分。

 
 
 
 
  1. created() {
  2.             // fetch the train model from server
  3.             thisthis.content_data = this.shuffle(book_data);
  4.             this.loading = true;
  5.             axios.post('http://localhost:3000/getNetwork')
  6.                 .then((response) => {
  7.                     console.log(response);
  8.                     this.loading = false;
  9.                     const networkJSON = response.data.network;
  10.                     if (networkJSON && Object.keys(networkJSON).length > 0) {
  11.                         this.$message('Received neural network from server.');
  12.                         localNetworkInstance = Network.fromJSON(networkJSON);
  13.                     } else {
  14.                         this.$message('Created a new network instance.');
  15.                         // create a new network instance
  16.                         const inputLayer = new Layer(20);
  17.                         const hiddenLayer = new Layer(20);
  18.                         const outputLayer = new Layer(20);
  19.                         inputLayer.project(hiddenLayer);
  20.                         hiddenLayer.project(outputLayer);
  21.                         localNetworkInstance = new Network({
  22.                             input: inputLayer,
  23.                             hidden: [hiddenLayer],
  24.                             output: outputLayer
  25.                         });
  26.                     }
  27.                 })
  28.                 .catch(function (error) {
  29.                     this.loading = false;
  30.                     console.log(error);
  31.                 });
  32.         },

以上是我們?cè)趹?yīng)用程序中創(chuàng)建的生命周期(lifecycle)。它嘗試從「getNetwork」API 獲取 JSON 對(duì)象:如果它是網(wǎng)絡(luò)的可用 JSON 設(shè)置,則它將通過 synaptic 的 fromJSON 方法創(chuàng)建本地網(wǎng)絡(luò)實(shí)例;否則,它將創(chuàng)建一個(gè)新的網(wǎng)絡(luò)實(shí)例并保存到「localNetworkInstance」變量中。

當(dāng)用戶在***頁單擊「下一頁」按鈕后,我們?cè)凇竜nClick」功能中調(diào)用激活函數(shù),并將其作為預(yù)測(cè)結(jié)果保存在 Vue 組件的數(shù)據(jù)中。然后在用戶選擇他/她感興趣的電影之后,調(diào)用重新訓(xùn)練函數(shù)。

 
 
 
 
  1. reTrainByThisUserData() {
  2.     // retrain the model by this user's data
  3.     if (localNetworkInstance) {
  4.         localNetworkInstance.propagate(learningRate, this.trainingSet.output);   // propagate the network
  5.         this.$message('Neural Network retrained!');
  6.         const successFunc = () => {
  7.             console.log('success');
  8.             this.$message('Successfully sent the new Neural Network!');
  9.         };
  10.         const errorFunc = (error) => {
  11.             console.log('error', error);
  12.             this.$message(error);
  13.         };
  14.         this.loading = true;
  15.         axios.post('http://localhost:3000/setNetwork', {
  16.             networkJSON: localNetworkInstance.toJSON()
  17.         })
  18.             .then((response) => {
  19.                 this.loading = false;
  20.                 if (response.data && response.data.code === 200) {
  21.                     successFunc();
  22.                 } else {
  23.                     errorFunc(response.data);
  24.                 }
  25.             })
  26.             .catch(function (error) {
  27.                 errorFunc(error)
  28.             });
  29.     } else {
  30.         this.loading = false;
  31.         console.log('network is undefined!');
  32.     }
  33. }

重新訓(xùn)練過程是一個(gè)反向傳播過程,利用當(dāng)前用戶的選擇作為輸入和輸出數(shù)據(jù)對(duì)。用戶對(duì)電影的選擇將成為反向傳播的數(shù)據(jù)。在反向傳播后,神經(jīng)網(wǎng)絡(luò)的權(quán)重將被調(diào)整,神經(jīng)網(wǎng)絡(luò)的新數(shù)據(jù)將被上傳到服務(wù)器并被保存。理想情況下,新網(wǎng)絡(luò)應(yīng)該更強(qiáng)大:)

進(jìn)一步探索

正如很多讀者可能已經(jīng)意識(shí)到的那樣,我們可以利用這個(gè)方法做比簡(jiǎn)單推薦系統(tǒng)更多的事情。改進(jìn)此項(xiàng)目的一些可能方法包括:

  • 更多關(guān)于瀏覽器的信息可以當(dāng)作輸入,例如用戶在每張卡上花費(fèi)的時(shí)間、用戶的點(diǎn)擊事件和滾動(dòng)事件等。這些信息可以從前端得到。
  • 神經(jīng)網(wǎng)絡(luò)可以具有更復(fù)雜的架構(gòu),但注意不能過擬合。
  • 前端項(xiàng)目應(yīng)該考慮大小。目前,構(gòu)建的文件大小約為 1Mb,這在 PC 上是可以接受的,但對(duì)于移動(dòng)端網(wǎng)站來說可能太大了。如果要在移動(dòng)設(shè)備上使用該項(xiàng)目,應(yīng)采取優(yōu)化措施。

有關(guān)此項(xiàng)目的完整代碼,請(qǐng)查閱參考:

https://github.com/markselby9/ml-in-browser/tree/feature/Recommendation_system_in_browser_demo。

原文:https://medium.com/@markselby9/neural-network-in-your-browser-3e6fc91709ca

【本文是專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】


本文名稱:如何在瀏覽器使用synaptic.js訓(xùn)練簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)推薦系統(tǒng)
URL標(biāo)題:http://www.5511xx.com/article/cdidcph.html