標籤:

最終章 | TensorFlow戰Kaggle「手寫識別達成99%準確率

歡迎關注我們的微信公眾號「人工智慧LeadAI」(ID:atleadai)

這是一個TensorFlow的系列文章,本文是第三篇,在這個系列中,你講了解到機器學習的一些基本概念、TensorFlow的使用,並能實際完成手寫數字識別、圖像分類、風格遷移等實戰項目。

文章將盡量用平實的語言描述、少用公式、多用代碼截圖,總之這將是一份很贊的入門指南。歡迎分享/關注。

上一篇文章,我們用CNN實現了手寫識別

CNN網路模型舉例

改進方案

1、 使用Keras框架,而不是用TensorFlow自己實現,提升編程效率

2、增加網路的深度,這裡增加到了20層

3、每次卷積完之後,加入規範層

4、使用最新的SELU激活函數,這是Sepp Hochreiter最新發表在arXiv上的激活函數,Sepp是當年和Jürgen Schmidhuber 一起發明 LSTM 的神級人物。介紹參考這個鏈接:「自歸一化神經網路」提出新型激活函數SELU(iana.org/domains/reserv

理論知識補充(最小知識集)

1、BatchNormalization 的計算原理,優缺點

為了避免對數據的感應不銘感,會對數據做處理,使得數據的變化範圍不會太大,這個處理叫normalization預處理。Batch normalization 的 batch 是批數據, 把數據分成小批小批進行隨機梯度下降. 而且在每批數據進行前向傳遞 forward propagation 的時候, 對每一層都進行 normalization 的處理。 優點是可以避免數據對激活函數的飽和從而收斂到更好的結果,並且能減少訓練時長。

2、rmsprop 優化器的原理,優缺點

RMSprop 是 Geoff Hinton 提出的一種以梯度的平方來自適應調節學習率的優化方法。

優點是,對於常見參數更新較小,自動更新,不用手動調節學習率

缺點是,因為公式中分母上會累加梯度平方,這樣在訓練中持續增大的話,會使學習率非常小,甚至趨近無窮小

3、池化層的計算原理

池化層是在幾個數據中挑選出最能代表這個區域的,把一個區域簡化成一個數值,可以取最大值、最小值、平均值。這樣可以降低計算量,降低過擬合。

4、softmax與 sigmoid 激活函數的區別

sigmoid將一個real value映射到(0,1)的區間(當然也可以是(-1,1)),這樣可以用來做二分類。

而softmax把一個k維的real value向量(a1,a2,a3,a4….)映射成一個(b1,b2,b3,b4….)其中bi是一個0-1的數值,b1到bn累加為1,然後可以根據bi的大小來進行多分類的任務,如取權重最大的一維。

5、categorical_crossentropy 的計算原理,為什麼選擇交叉熵而不是平均平方誤差(MSE)

交叉熵計算原理是?[ylna+(1?y)ln(1?a)]。不選擇MSE的原因是,使用MSE在Y取較大值時,權重和偏置的更新速度會很慢,而用交叉熵作為損失函數可以克服這個問題

代碼實現

1、載入數據集,對數據集進行處理,把輸入和結果進行分開

2、設相關參數

3、定義模型

4、查看模型結構,可視化模型

5、訓練模型,保存和載入模型

6、生成預測結果

上傳Kaggle看結果

請注意,訓練是有一定隨機性的,如果一次訓練的不好,可以反覆嘗試訓練。盡量準確度在99.2%以上,再生成提交結果。

kaggle結果

雖然手寫識別已經有無數人做過了,但提交到Kaggle的只有1600多人,我們的結果在200多位,進入了前20%,對於新手來錯,應該還可以了。

祝大家好運~~~~

附帶之前的三篇文章:

《五分鐘喝不完一杯咖啡,但五分鐘可以入門TensorFlow》 《零基礎用TensorFlow玩轉Kaggle的「手寫識別」》 《用TensorFlow做Kaggle「手寫識別」達到98%準確率-詳解》

到這裡,手寫識別的系列就結束了。通過做項目,我們能快速掌握技能,但有時候總有隻知其然不知其所以然的模糊感,下面的系列將會和大家一起對機器學習的理論部分進行概覽,用簡單的文字解釋一個個知識點。


推薦閱讀:

TAG:TensorFlow | Kaggle |