使用Tensorflow做Kaggle入門題之數字識別

提示:

  1. 本文中CNN雖然簡單但是模型參數較多,因此建議有條件的同學考慮使用GPU訓練。
  2. 本文雖然在講Kaggle的這個mnist題目,但是目的不僅僅是像前文(使用Tensorflow做Kaggle入門題之泰坦尼克 - 知乎專欄)這樣做到命令式的調用,而是將Tensorflow中各種工具和方法串起來,產出一個工程性的,模塊化的項目。
  3. 由於原因2,因此本文內不放代碼,完整代碼和歷次改動可以參考(moshoujingli/kaggle-mnist)。希望讀者可以在碎片時間預習本文之後,對照完整代碼和Tenorflow的例子代碼,自己從頭實現(請不要copy,筆者在這個過程中鞏固和實踐了很多Tensorflow的用法)。

文章結構

  • 問題描述
  • 兩種方法
    • 多層感知機

      • 網路結構
      • 實驗
    • 卷積神經網路
      • 網路結構
      • 實驗
  • 總結

問題描述

在手寫數字數據集MNIST(Modified National Institute of Standards and Technology)跑分類演算法,可以說是計算機識別的Hello world級的任務了。該數據集是大約6W對圖片和標籤的組合,圖片為28*28像素的灰度圖,每個像素點的灰度為0到255,標籤為該圖片中的數字,為0-9中的一個整數。

上圖四個數字分別是3 1 1 7

我們需要解決的問題就是在這個數據集上訓練我們的模型,然後讓這個模型接受一批新的同類型圖片作為輸入,給出圖片對應的數字。

Kaggle上可下載的文件分別為

  • sample_submission.csv 樣例輸入,注意id從1開始
  • train.csv 訓練數據,每行有785列,第一列為標籤(label),之後784列,每列c為一個像素的灰度值,該像素值對應的坐標為(c/28,c%28)
  • test.csv 需要進行分類的數據,每行有784列,沒有第一列標籤,其他和訓練數據一致。

解決方法

一般來說我們有兩種方法來解決這個問題。

一個相對簡單,和之前預測是否倖存的文章一樣,使用多層感知機(就是包含了隱層的神經網路)來進行多分類。

另外一個是解決圖片問題的通用方法,即卷積神經網路(CNN),相比於第一種方法,因為增加了卷積層,通過該層的輸出來保存了輸入數據在二維上的統計特徵,提高了分類的準確率。

下面會分兩種方法分別進行介紹和實驗,除了必要的文字和代碼解釋,會直接用tensorboard的輸出來說明(關於tensorboard的使用請參考使用Tensorflow時的爽物之Tensorboard - 知乎專欄)。

多層感知機

網路結構

單個隱層,1024個神經元

實驗

在自定義的測試集(train.csv的最後256個)拿到98.5%的準確率,在最終的測試集上拿到97.21%的準確率。

卷積神經網路

什麼是卷積請參考(搞深度學習早晚要懂的數學之卷積 - 知乎專欄)。由於在網路中儘力保留了圖片像素間的位置關係這一關鍵信息,一個相對簡單的卷積神經網路就可以取得更好的效果。

網路結構

輸入的圖片為單灰度通道的二維數據。

數據經過32個5x5的卷積核後,變為32個的同尺寸的二維數據。

對這32個二維數據每四個像素點選出其中最大的值傳遞到下一層(max pool,最大池化,縮小數據規模同時保留小區域內的強信息),此時下一層的輸入尺寸降低一半(14x14)。

之後對每個二維數據應用兩個5x5的卷積核,因此在這一層,32個 14x14 的二維數據變為64個。

對這64個二維數據每四個像素點選出其中最大的值傳遞到下一層,此時下一層的輸入尺寸降低一半(7x7)。

在這一層把二維信息打平,組成一個全聯接的隱層。

將隱層和數據之間也建立全聯接。

實驗

因為卷積層保留了二維信息並提供給了一個相對更大的隱層,我們有更多的參數可供訓練,因此我們還加入了L2 loss和drop out來避免發生過擬合(在一開始我沒加這兩個的時候過擬合已經發生了,在訓練集上100%但是測試集上表現不穩定)

L2 Loss

某些權重向量的2範數(平方和求根號),用來減少生效權重的大小,從而一定程度上抑制過擬合。

參考:p-範數

DropOut(tf.nn.dropout(tensor,percent) )

可以簡單認為這個操作就是把輸入的tensor中的a%置為0,而另一部分的大小除以a%。一個形象的理解就是把某一層的輸入隨機遮擋一部分並強化剩餘的部分,以提示網路想辦法儘可能少的利用多餘信息。論文:cs.toronto.edu/~hinton/

迭代過程中的loss和準確度:

最終測試集上拿到99.143%,leaderboard的前17%

總結

  1. 處理圖片識別問題,CNN相對效果提升很多,幾乎可以認為是通法。
  2. 如果發現過擬合,在l2 loss之外,還可以考慮dropout。
  3. 對原始信息保留的多少對神經網路最終效果有巨大影響。

推薦閱讀:

如何評價中科院山世光老師開源的Seetaface人臉識別引擎?
請問如何將深度學習Caffe做成一個動態庫,方便在其他應用程序中調用?
目前世界上有對強人工智慧的嘗試嗎?具體瓶頸是什麼?
分散式深度學習系統與傳統的分散式系統的區別?
對於一個可以窮舉的問題,比如五子棋,深度學習得到的模型和窮舉的演算法有啥異同?

TAG:TensorFlow | 深度学习DeepLearning | 计算机视觉 |