最終章 | TensorFlow戰Kaggle「手寫識別達成99%準確率
歡迎關注我們的微信公眾號「人工智慧LeadAI」(ID:atleadai)
這是一個TensorFlow的系列文章,本文是第三篇,在這個系列中,你講了解到機器學習的一些基本概念、TensorFlow的使用,並能實際完成手寫數字識別、圖像分類、風格遷移等實戰項目。
文章將盡量用平實的語言描述、少用公式、多用代碼截圖,總之這將是一份很贊的入門指南。歡迎分享/關注。
上一篇文章,我們用CNN實現了手寫識別
改進方案
1、 使用Keras框架,而不是用TensorFlow自己實現,提升編程效率
2、增加網路的深度,這裡增加到了20層
3、每次卷積完之後,加入規範層
4、使用最新的SELU激活函數,這是Sepp Hochreiter最新發表在arXiv上的激活函數,Sepp是當年和Jürgen Schmidhuber 一起發明 LSTM 的神級人物。介紹參考這個鏈接:「自歸一化神經網路」提出新型激活函數SELU(https://www.iana.org/domains/reserved)
理論知識補充(最小知識集)
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取較大值時,權重和偏置的更新速度會很慢,而用交叉熵作為損失函數可以克服這個問題
代碼實現
上傳Kaggle看結果
請注意,訓練是有一定隨機性的,如果一次訓練的不好,可以反覆嘗試訓練。盡量準確度在99.2%以上,再生成提交結果。
雖然手寫識別已經有無數人做過了,但提交到Kaggle的只有1600多人,我們的結果在200多位,進入了前20%,對於新手來錯,應該還可以了。
祝大家好運~~~~
附帶之前的三篇文章:
《五分鐘喝不完一杯咖啡,但五分鐘可以入門TensorFlow》 《零基礎用TensorFlow玩轉Kaggle的「手寫識別」》 《用TensorFlow做Kaggle「手寫識別」達到98%準確率-詳解》
到這裡,手寫識別的系列就結束了。通過做項目,我們能快速掌握技能,但有時候總有隻知其然不知其所以然的模糊感,下面的系列將會和大家一起對機器學習的理論部分進行概覽,用簡單的文字解釋一個個知識點。
推薦閱讀:
TAG:TensorFlow | Kaggle |