機器學習數據集篇——QMNIST數據集

我們在很久之前介紹過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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章