我們在很久之前介紹過MNIST的測試集,詳情參見博客:機器學習數據集篇——MNIST數據集。MNIST數據集是一個大型的手寫體數字數據庫,通常用於訓練各種圖像處理系統,也被廣泛用於機器學習領域的訓練和測試。MNIST數據庫中的圖像集是NIST(National Institute of Standards and Technology)的兩個數據庫的組合。
MNIST作爲機器學習非常基礎的數據集,真的不存在什麼問題麼? 官方MNIST測試集僅包含10,000張隨機採樣圖像,並且通常被認爲太小而不能提供有意義的置信區間。這就要求從MNIST的源頭來考慮這個數據集的各個方面,也就是說要求重構MNIST。十幾天前,MNIST的重構數據集QMNIST發佈了。 QMNIST數據集是NIST特殊數據庫中找到的原始數據重構生成的,並且重構了之前數據集測試集中丟失50,000張測試圖像數據,形成了完整的QMNIST數據集。
Paper地址:Cold Case The Lost MNIST Digits
Github地址:QMNIST數據集
1. QMNIST的重構步驟
(1)根據MNIST數據集論文的信息,從第一個重構算法開始嘗試;
(2)利用Hungarian算法找到MNIST訓練數字和我們重構的訓練數字之間最佳配對的匹配;尋找MNIST作者可以採取哪些不同的方式來證明這些差異,同時不改變現有的最佳匹配;
(3)嘗試重建算法的新的辯題,將其輸出與MNIST訓練集中的最佳對應匹配,並且不斷重複該過程;
【注意】最佳匹配的度量可以選擇距離度量,例如L2 distance和Linf distance;
在性能方面的衡量:基於論文 Gradient Based Learning Applied to Document Recognition,利用手寫數字的識別率作爲參照來評價QMNIST的性能;
2. QMNIST數據集
經過重構算法、距離的最佳匹配和置信度區間的衡量,MNIST的重建結果如下:
(1)啓用了兩個訓練數據集——MNIST訓練集(60,000)和QMNIST訓練集(60,000);
(2)啓用了三個測試數據集——MNIST測試集(10,000)、QMNIST10K訓練集(10,000)和QMNIST50K訓練集(60,000);
將MNIST的重建結果QMNIST給了新的命名來區分使用的測試集是哪一個,TMTM、TMTQ10和TMTQ50。 在LeNet5上做了識別率的測試,如下表所示:
論文中來做了幾種典型機器學習和深度學習方法的實驗,用到了KNN、SVM和MLP,具體的實驗結果可以參見論文的第三章。從實驗結果來看,“testing set rot”的問題是存在的,但遠沒有擔心的那麼嚴重。雖然重複使用相同測試樣本的做法會影響絕對性能數字,但從長遠來看,它也提供了有助於模型選擇的配對優勢。
3. QMNIST的使用
我們先來認識一下QMNIST發佈的數據文件和標籤文件(MNIST和QMNIST的訓練集相同,沒有做改變),如下表:
Filename | Train/Test | Format | Description |
---|---|---|---|
qmnist-train-images-idx3-ubyte.gz | Train | 60000x28x28 | testing images |
qmnist-train-labels-idx2-int.gz | Train | 60000x8 | extended train labels |
qmnist-train-labels.tsv.gz | Train | 60000x8 | same, tab separated file |
qmnist-test-images-idx3-ubyte.gz | Test | 60000x28x28 | testing images |
qmnist-test-labels-idx1-ubyte.gz | Test | 60000 | testing labels |
qmnist-test-labels-idx2-int.gz | Test | 60000x8 | extended testing labels |
qmnist-test-labels.tsv.gz | Test | 60000x8 | same, tab separated file |
QMNIST在MNIST的基礎上補充了很多的信息,因爲它追溯到了原始數據集NIST。在補充的信息裏面,主要含有8種信息,如下表所示:
Filename | Description | Range |
---|---|---|
0 | Character class | 0 to 9 |
1 | NIST HSF series | 0, 1, or 4 |
2 | NIST writer ID | 0-326 and 2100-2599 |
3 | Digit index for this writer | 0 to 149 |
4 | NIST class code | 30-39 |
5 | Global NIST digit index | 0 to 281769 |
6 | Duplicate | 0 |
7 | Unused | 0 |
因爲QMNIST用的數據文件有兩種格式,一種是.tsv
;另一種是.gz
;具體的可以參見MNIST博客怎樣讀取.gz格式的文件,圖像和標籤的數據文件都有8個佔位符,要注意讀取位置和順序,也把讀取的代碼貼到下面僅供參考;
import numpy as np
import struct
import cv2
import matplotlib.pyplot as plt
def readfile():
binfile_image = open('qmnist-test-images-idx3-ubyte' , 'rb')
buf_image = binfile_image.read()
binfile_label = open('qmnist-test-labels-idx1-ubyte' , 'rb')
buf_label = binfile_label.read()
return buf_image, buf_label
def get_image(buf_image):
image_index = 0
image_index += struct.calcsize('>IIII')
magic,numImages,imgRows,imgCols=struct.unpack_from(">IIII",buf_image,0)
image = []
for i in range(1):
temp = struct.unpack_from('>784B', buf_image, image_index)
image.append(np.reshape(temp,(28,28)))
image_index += struct.calcsize('>784B')
return image
def get_label(buf_label):
label_index = 0
label_index += struct.calcsize('>II')
return struct.unpack_from('>100B',buf_label,label_index)
image_data,label_data = readfile()
image = get_image(image_data)
label = get_label(label_data)
plt.imshow(image[0],cmap='gray')
plt.show()