Minst 手寫訓練集 python

以往我們有一個新的類神經訓練模型,我們都會用single pole或是double pole來測試模型的訓練結果。以目前類神經網路發展的狀況,single pole 與double pole已不能滿足需求。進一步,我們會使用MNIST訓練集來訓練。網址在此

http://yann.lecun.com/exdb/mnist/

一進去我們就看到三個作者 Yann LeCun, Corinna Cortes, Christopher J.C. Burges,我們向他們致敬。

然後就是四個重要的檔案。

train-images-idx3-ubyte.gz:  training set images (9912422 bytes)
train-labels-idx1-ubyte.gz:  training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz:   test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz:   test set labels (4542 bytes)

第一跟第二個是拿來訓練用的,第三跟第四個是拿來測試的。我們可以注意到有image跟labels兩種檔。image是圖檔,labels是對應圖檔的答案。

雖然TensorFlow有方便的讀取方法。但如果我們想要自己用python讀來用。要如何做呢?
我們要先看一下網頁中的這部份

我們可以看到offset,代表讀的byte數。就是說我們開了檔之後。read進來,以label檔來說,data[0:4]會等於2049。data[4:8]等於60000。

了解檔案的格式,我們就可以寫一個小程式來讀讀看。
因為offset是4個為一個單位,所以我們先寫一下轉byte為數字的程式

def b2i(b):
    return int(codecs.encode(b, 'hex'), 16)

with open("."+os.sep+"train-images.idx3-ubyte", 'rb') as f:
    data = f.read()
    type = b2i(data[0:4]) # image file 為 2051
    dataLen = b2i(data[4:8]) # 訓練集為 60000
    rows = b2i(data[8:12])
    cols = b2i(data[12:16])
    getImage = np.frombuffer(data, dtype=np.uint8, offset=16)#從offset 16 開始為圖資
    getImage = getImage.reshape(dataLen, rows, cols)

到這裡,圖資讀完,如果要把圖一張張存下來

for i in range(0, len(getImage)):#小心,共有60000張圖!!
    scipy.misc.imsave(str(i) + ".jpg", getImage[i])

讀label檔

with open("."+os.sep+"train-labels.idx1-ubyte", 'rb') as f:
    data = f.read()
    type = b2i(data[0:4]) # label file 為 2049
    dataLen = b2i(data[4:8]) # 訓練集為 60000
    getLabel = np.frombuffer(data, dtype=np.uint8, offset=16)#從offset 16 開始為label
    getLabel = getLabel.reshape(dataLen)

到這裡,圖資讀完,如果要把圖一張張存下來,加上答案為檔名

for i in range(0, len(getImage)):#小心,共有60000張圖!!
    scipy.misc.imsave(str(i) + "_" + str(getLabel[i]) + ".jpg", getImage[i])


對!import 有
import os, codecs
import numpy as np
import scipy.misc




留言

這個網誌中的熱門文章

python 找圖自動點擊

Python pyserial 抓取系統內的 COM PORT

VBA EXCEL 工作表變化 馬上執行 的作法 Worksheet_Change