MNIST初級入門解讀

MNIST初級入門解讀
https://www.tensorflow.org/get_started/mnist/beginners
http://yann.lecun.com/exdb/mnist/
http://www.jianshu.com/p/84f72791806f


機器學習的“Hello world!”程序就是MNIST。
MNIST是一個簡單的計算機視覺數據圖片集,手寫的0-9。
MNIST數據集分爲三部分:訓練數據55000,測試數據10000,驗證數據5000.(這一說法可能有點問題,參見:MNIST手寫數字數據庫簡介)
圖片標準:28x28=784象素。扁平化後後,形成784x1的向量。雖然丟失了二維結構的信息,但softmax迴歸也用不上。
把每張圖片視爲一個784個值的一維向量,55000張圖片就是shape=[55000,784]的二維矩陣。
每個元素是一個0-1之間的灰度值。(0-255: 0,背景,白色; 255,前景,黑色)


標籤:每張圖有一個對應的標籤,指出這張圖寫的是什麼數字。代碼設計中,一個數字用一個長度爲10的向量表示,數字爲幾,就把對應下標的位置置1,下標從0開始。如數字3,寫爲 [0,0,0,1,0,0,0,0,0,0].這樣,標籤的shape=[55000,10]
本章的目的是學習softmax迴歸。
mnist_softmax.py的源碼下載:https://www.github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/examples/tutorials/mnist/mnist_softmax.py
如果不想下載,安裝tensorflow後,可直接在IDE中導入【安裝目錄】\Lib\site-packages\tensorflow\examples\tutorials\mnist的python項目。


MNIST手寫數字數據庫簡介
60000個訓練數據,10000個測試數據。固定圖片大小。不用再去預處理和格式化。但實際項目中,這一步少不了,而且比較繁瑣。
運行程序後,後有四個包下載到本地目錄:C:\tmp\tensorflow\mnist\input_data
t10k-images-idx3-ubyte.gz #測試數據圖片10000張
t10k-labels-idx1-ubyte.gz #測試數據標籤10000個
train-images-idx3-ubyte.gz #訓練數據圖片60000張
train-labels-idx1-ubyte.gz #訓練數據標籤60000個
在mnist.py中read_data_sets函數中,base.maybe_download給出的下載路徑爲:
SOURCE_URL = 'https://storage.googleapis.com/cvdf-datasets/mnist/'
也就是從google下下載的,不是直接從http://yann.lecun.com/exdb/mnist/下載的。
圖片不是標準的image格式,得根據它的格式寫程序重新讀。
圖片內容部分20x20,加上邊框部分是28x28.
MNIST源自NIST的特別數據庫(SD-3,Special Database 3)和SD-1。SD-3來自人口普查局,比較好認。SD-1來自高校,難認點。MNIST從SD-3和SD-1各抽了30000份數據,共60000份做訓練數據。測試數據的10000份也是從兩個庫各抽了一半。
近20年來,這個數據集被各種方式測試,成爲經典。包括:Linear Classifiers,KNN,Boosted Stumps,Non-Linear Classifiers,支持向量機SVM,Neural Nets,卷積網Convolutional nets。錯誤率也從最早的12%降到了0.23%。一般認爲,卷積網的效果最好。
圖片格式:
文件的整數(integer)以大端(high endian)方式存儲。注意:intel處理器是小端方式,需要轉換。


train-labels-idx1-ubyte文件格式:


[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  60000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label
label的值爲0-9.


train-images-idx3-ubyte文件格式:


[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  60000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel
pixel的值:0-255


t10k-labels-idx1-ubyte:
[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  10000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label


t10k-images-idx3-ubyte:
[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  10000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel




IDX文件通用格式:
magic number 
size in dimension 0 
size in dimension 1 
size in dimension 2 
..... 
size in dimension N 
data


解釋:
1.魔術數。 大端方式。4bytes.
           |------------|------------|------------|------------|
           |   0        |  0         |編碼數據類型| 維數       |   
  |------------|------------|------------|------------|
   編碼數據類型:即指出data段是什麼數據類型。包括:
0x08: unsigned byte 
0x09: signed byte 
0x0B: short (2 bytes) 
0x0C: int (4 bytes) 
0x0D: float (4 bytes) 
0x0E: double (8 bytes)
   維數:即rank.
2.size段,大端方式。4bytes. 維數是幾就應該有幾行。
3.data段,類擬於高維的C數組。
如何查看IDX的圖片文件?
解析查看代碼,參見:http://www.jianshu.com/p/84f72791806f
代碼是python2.7版本的,修改print語句爲帶括號的形式,正確放置IDX文件路徑,即可查看。在matplot窗口查看圖,控制檯會給出對應的標籤。




mnist.train.images
mnist.train.labels
兩者成對出現。


問題1:到底訓練數據是55000還是60000?
回答:從代碼調試看,num_images=60000.最後返回的是一個shape(60000,28,28,1)的張量。
問題2:象素值到底是0-1還是0-255?
回答:從代碼調試看,值是0-255.
問題:標籤是如何表式的?
回答:標籤從文件中讀出來時是個一維list,[5,0,4...5,6,8],通過mnist.py的dense_to_one_hot()後,就成了一個shape(6000,10)的張量。


softmax就是這樣一層模型,它給出每種情況一種可能性,所有的可能性加起來爲1。一般用來形成輸出層的概率分佈。
過程:1)累加絕對數  2)歸一化
如果圖片不象某類,給個負數;如果圖片象某類,給個正數。可以這樣理解,比如數字0,如果在圖的中間地帶出來了色彩,那它不太可能是0,給一個負向激勵;相反,色彩出現在中間地帶的周圍,它更有可能是0,給一個正向激勵。


數學部分圖解:


實現部分:
要點仍然是定義損失函數,最小化損失函數。
這裏使用“交叉熵”函數做爲損失函數,下面是原始的形式,比較接近公式定義,但不穩定,所以使用改進行形式。
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))


核心代碼(改進形式):
cross_entropy = tf.reduce_mean(
          tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) #損失函數

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) #優化





手寫體5的程序內部存儲結構:



標籤的程序內部存儲結構:




下次做點小練習。

今天跑了下mnist_deep.py,試了三次,基本上訓練數據快跑完,該跑測試數據的時候,python就掛了。從20000減到200都不行。可能環境的兼容性還是有點問題。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章