机器学习数据集篇——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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章