1. 程式人生 > >TensorFlow學習筆記(二):快速理解Tutorial第一個例子-MNIST機器學習入門

TensorFlow學習筆記(二):快速理解Tutorial第一個例子-MNIST機器學習入門

    TensorFlow教程的第一章“MNIST機器學習入門”很簡單,用了一個很簡單的網路,實現了MNIST樣本訓練。

    教程連結:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html

    下面這些內容主要是解釋這個教程中不是特別明確的地方。

1. 怎樣理解MNIST

MNIST的全稱是Mixed National Institute of Standards and Technology database,是一系列帶標記的數字圖片。原始的NIST資料集的訓練集是美國人口普查局的僱員的筆跡,而驗證集是採集自美國中學生的筆跡。所以從機器學習的角度看,這是一種不太合理的樣本採集。因此Lecun在進行卷積神經網路的研究時候從原始的NIST兩個資料集中選擇並重新混合形成新的訓練集和驗證集,也就是現在的MNIST。MNIST的圖片一般都是28*28的圖片,每個畫素值進行了歸一化,使得其在0-1範圍內,不過也有部分資料集把它們又恢復到0-255,每個數字圖片都有對應的標記。MNIST的訓練集一共有60000個樣本,而驗證集有10000個樣本。

2.怎樣理解權值和Softmax

“MNIST機器學習入門”裡面,沒有用卷積神經網路,而是用了一個全連線神經網路+Softmax輸出層。

MNIST的一幅圖片是28*28,因此一共有784個畫素值,在第一個例子裡面,我們就直接就考慮用這784個數字得出正確的數字結果。最簡單的考慮,我們要對這個784個數字進行加權求和,然後加點偏置,然後衡量一下得出的結果,看到底和哪個數字最像。那麼這個加權加偏移的結構就是全連線神經網,而這個衡量結果的過程就是Softmax。實際的運算是將784個畫素輸入加權,並且用不同的權值加權10次(因為有0-9一共10個數字),得到10個不同的結果,最後使用Softmax進行結果的輸出。

Softmax的公式如下,這個Xi是得到的10個不同的結果。

因此,最終得到的10個輸出都會有一個概率值,這個概率值處於0-1之間,而且10個輸出相加等於1。

將整個神經網路表示成一個表示式,就是:

其中W是權值,b是偏移

3.怎樣訓練這個網路?

按照TensorFlow的封裝,訓練這個例子中的神經網路只是幾句話的事情。

為了衡量目前神經網路中的權值和偏移是否合理,我們可以定義交叉熵。交叉熵的公式是:

y 是我們預測的概率分佈, y' 是實際的分佈,比如我這個數字是2,那麼我實際的分佈就應該是(0,0,1,0,0,0,0,0,0,0)。而神經網輸出的結果即預測的分佈y可能是(0.01,0.05,0.5,0.05,0.04.......),那麼交叉熵就是-log(0.5)>0,因此如果神經網路的效能約好,那麼交叉熵就會越小,最終接近於0. 在這個例子的訓練中,使用的是隨機梯度下降法結合反向傳播進行引數訓練。隨機梯度下降可以看Andrew NG的機器學習講義,也可以百度一篇文章。不過TensorFlow封裝的比較好,所以只需要3句話就可以訓練1000次,100是每次隨機選擇100個樣本進行訓練:

<code class="language-python">for i in range(1000):</code>  
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

TensorFlow教程第一章用了一個十分簡單的網路結構,重點講了如何設定網路,如何訓練,如何計算正確率。在下一章裡面,教程會介紹如何用複雜一些的架構,取得更好的訓練效果。