隨后,江寒操作著電腦,心無旁騖,很快就進入了狀態。
夏雨菲也不再來打擾他,拿著手機,半躺在床上,自己上網、聽歌。
江寒將高老師發送來的part012.rar和part013.rar下載下來,連同夏雨菲下載的前11個文件,放在了同一個文件夾中。
然后在第1個文件上點擊鼠標右鍵,選擇用WinRAR解壓縮,很快就得到了數據包。
一共兩個文件,train-images-idx3-ubyte與train-bels-idx1-ubyte。
idx3-ubyte和idx1-ubyte都是自定義的文件格式,官網上就有格式說明。
train-images文件大小超過1g,保存了20萬張手寫數字的圖片信息。
而train-bels中則存儲了20萬個標簽數據,與train-images一一對應。
和公開版本的MNIST不同,用于比賽的這個手寫數字數據集,數據量要大出好幾倍。
Kaggle官方將數據集分為兩部分,訓練集train向參賽選手公開,而測試集test則內部保存。
比賽的形式很簡單,大家根據公開的訓練集,編寫自己的程序,提交給主辦方。
主辦方用不公開的測試集數據,對這些程序逐一進行測試,然后比較它們在測試集上的表現。
主要指標是識別率,次要指標是識別速度等。
這是“人工神經網絡”在這類競技場上的初次亮相,江寒可不想鎩羽而歸。
事實上,如果想追求更好的成績,最好的辦法,就是弄出卷積神經網絡()來。
那玩意是圖像識別算法的大殺器。
在“機器學習”這個江湖中,的威力和地位,就相當于武俠世界中的倚天劍、屠龍刀。
一出,誰與爭鋒!
只可惜,這個東西江寒現在還沒研究出來。
現上轎現扎耳朵眼,也來不及了。
再說,飯要一口口吃,搞研究也得一步步來。
跨度不能太大嘍,免得扯到蛋……
所以在這次比賽中,江寒最多只能祭出“帶隱藏層的全連接神經網絡”(F)。
有了這個限制,就好比戴著鐐銬跳舞,給比賽平添了不少難度和變數。
那些發展了幾十年的優秀算法,也不見得會輸普通的F多少。
所以,現在妄言冠軍十拿九穩,還有點為時過早。
不過,有挑戰才更有趣味性嘛,穩贏的戰斗打起來有什么意思呢?
江寒根據官網上找到的數據格式說明文檔,編寫了一個文件解析函數,用來從兩個train文件中提取數據。
train-images-idx3-ubyte的格式挺簡單的,從文件頭部連續讀取4個32位整形數據,就能得到4個參數。
用來標識文件類型的魔數m、圖片數量n、每張圖片的高度h和寬度w。
從偏移0016開始,保存的都是圖片的像素數據。
顏色深度是8位,取值范圍0~255,代表著256級灰度信息,每個像素用一個字節來保存。
然后,從文件頭中可以得知,每張圖片的分辨率都是28×28。
這樣每張圖片就需要784個字節來存儲。
很容易就能計算出每張圖片的起始地址,從而實現隨機讀取。
如果連續讀取,那就更簡單了,只需要每次讀取784個字節,一共讀取n次,就能恰好讀取完整個文件。
需要注意的是,圖像數據的像素值,在文件中存儲類型為unsignedchar型,對應的format格式為B。
所以在Python程序中,在image_size(取值為784)這個參數的后面,還要加上B參數,這樣才能讀取一整張圖片的全部像素。
如果忘了加B,則只能讀取一個像素……
train-bels-idx1-ubyte格式更加簡單。
前8個字節是兩個32位整形,分別保存了魔數和圖片數量,從偏移0009開始,就是unsignedbyte類型的標簽數據了。
每個字節保存一張圖片的標簽,取值范圍0~9。
江寒很快就將標簽數據也解析了出來。
接下來,用Matplot的繪圖功能,將讀取出來的手寫數字圖片,繪制到屏幕上。
然后再將對應的標簽數據,也打印到輸出窗口,兩者一比較,就能很輕松地檢驗解析函數是否有問題。
將解析函數調試通過后,就可以繼續往下進行了。
首先要將圖片的像素信息壓縮一下,二值化或者歸一化,以提高運算速度,節省存貯空間。