?MNIST手寫字識別
廢話不多說,先上演示https://yuanyuangong.github.io/gyytensor/dist/index.html#/home
上面這個鏈接請復(fù)制,打開,簡書有毒
如果你家網(wǎng)絡(luò)掉渣,就直接 git?吧!HTTPS://GITHUB.COM/YUANYUANGONG/GYYTENSOR.GIT
第一記:手寫字?jǐn)?shù)據(jù)形式
在開篇最前面還是先講講手寫字識別深度學(xué)習(xí)原理。
這里測試用的手寫字圖片?為(28*28*1)的圖像,因為只有黑?所以?像素為 1。

當(dāng)然js可不認(rèn)識這么個,需要轉(zhuǎn)成?一個 28*28?的二維向量矩陣。?感受一下這個二維數(shù)組,

如果 7? 這個數(shù)字?都這么標(biāo)準(zhǔn)就好了,現(xiàn)實和殘酷,我寫的7是這樣的,我們就需要找到不同人寫的7的共同點,這就是提取特征,在我這個案例中?就用 卷積 (不要去管高等數(shù)學(xué)里的卷積,你就當(dāng)是全新的一種方式,下面會講解)的方式去提取。

第二記?卷積
先看一下tensorflow?里如何卷積的吧(再次強(qiáng)調(diào)不要被?卷積這個名詞 帶?到坑里去了,這里你就理解為?操作,沒有其他意思)

首先,
需要過濾器的卷積窗口來取樣,藍(lán)色就(5*5)過濾器 ,在這個案例里就是5*5?的二維0,1 數(shù)組,? 至于里面的值完全由tensorflow去初始化,


步進(jìn) strides: 1,?意味著?這個過濾器每一移動一個像素,從左到右?跑完?下移動一個像素,如下圖,總需要拖多少次。
28-5 = 24? 。24/1 = 24? 則 24*24次? 當(dāng)然你也可以把步長設(shè)置為6 ,那就是?那就24/6? 則4*4 =16次。不過這樣你會丟失很多信息。

這么個5*5的過濾器?拖了24*24?次得到?一個 24*24?的數(shù)組 g 。假設(shè)過濾器的?值為?f? ,那么 g[n][m] = f *?過濾器所拖的區(qū)域。
這里有8?個過濾器,那就得到 8個 24*24?的矩陣。?這樣我們就把 7?這個圖?搞了 8個特征,如果你寫了一個7 ,通過?同樣的?卷積,也等到 8?個24*24?的矩陣,進(jìn)行比較??纯聪嗖疃嗌?。再去優(yōu)化?那8個過濾器。
當(dāng)然現(xiàn)實里?可不會這么簡單。為了進(jìn)一步提高?學(xué)習(xí)效率。我們要有一些其他手段,比如吃補(bǔ)藥。---池化
第三記? 池化

poolSize , 2*2?的窗口,每次移動2?個像素?得到 6*6的矩陣。

我們一次卷積和池化還不行,多來幾次 ,完整代碼如下

第四記 flaten? 和全鏈接層
原理什么的不重要了,flaten?就是把多維數(shù)組轉(zhuǎn)成?一維數(shù)組,方便統(tǒng)計操作,全鏈接dense?就是為了分類。
先分成64類,在分成0-9 10類
?第五記?開始訓(xùn)練模型
第一步,數(shù)據(jù)獲取,預(yù)處理。下面數(shù)MNIST手寫字?jǐn)?shù)據(jù)鏈接,不是人可以看懂的數(shù)據(jù),所以需要預(yù)處理,通過webapi?

new Img() ,具體的我就不肺炎了,反正最后通過data.js可以獲得手寫字?jǐn)?shù)據(jù)。
第二步,載入數(shù)據(jù),這里,不可一個個載到模型里去跑,太慢,也不能一次性把所有數(shù)據(jù)載入,瀏覽器要炸的。所以分批次,
model.fit?載入數(shù)據(jù)?直到?所有數(shù)據(jù)被處理完就停止?循環(huán),應(yīng)該?內(nèi)置 setIntertime?方法

第四步,驗證模型獲得?測試結(jié)果 (準(zhǔn)確率)

第六記,UI?繪圖部分
這里用canvas繪制手寫字的圖片,并顯示預(yù)測結(jié)果。

echart顯示損失率,和精確率的曲線

最后:
本人是新接觸tensorflow.js的新人,還望各路大仙指點一二