加载 EMNIST-letters 数据集
loading EMNIST-letters dataset
我一直在尝试寻找一种方法来加载 EMNIST-letters 数据集,但没有取得太大成功。我在结构中发现了一些有趣的东西,无法理解正在发生的事情。这就是我的意思:
我下载了 .mat 格式 in here
我可以使用
加载数据
import scipy.io
mat = scipy.io.loadmat('letter_data.mat') # renamed for conveniance
这是一本字典,关键字如下:
dict_keys(['__header__', '__version__', '__globals__', 'dataset'])
唯一感兴趣的关键是数据集,我无法从中收集数据。打印它的形状给这个:
>>>print(mat['dataset'].shape)
(1, 1)
我越挖越深,找到了一个看起来有点像真实数据集的形状,并发现了这个:
>>>print(mat['dataset'][0][0][0][0][0][0].shape)
(124800, 784)
这正是我想要的,但我找不到标签和测试数据,我尝试了很多东西但似乎无法理解这个数据集的结构。
如果有人能告诉我这是怎么回事,我将不胜感激
由于数据集的结构方式,可以使用 mat['dataset'][0][0][0][0][0][0]
访问图像数组,使用 mat['dataset'][0][0][0][0][0][1]
访问标签数组。例如,print(mat['dataset'][0][0][0][0][0][0][0])
将打印出第一张图像的像素值,而 print(mat['dataset'][0][0][0][0][0][1][0])
将打印出第一张图像的标签。
对于较少...复杂的数据集,我实际上建议使用 Kaggle 上的 EMNIST 数据集的 CSV 版本:https://www.kaggle.com/crawford/emnist,其中每一行都是一个单独的图像,有 785 列,其中第一列 = class_label,之后的每一列代表一个像素值(28 x 28 图像总共 784 个)。
@Josh Payne 的回答是正确的,但我会针对那些想要使用 .mat 文件并强调典型数据拆分的人对其进行扩展。
数据本身已经被分成训练和测试集。以下是我访问数据的方式:
from scipy import io as sio
mat = sio.loadmat('emnist-letters.mat')
data = mat['dataset']
X_train = data['train'][0,0]['images'][0,0]
y_train = data['train'][0,0]['labels'][0,0]
X_test = data['test'][0,0]['images'][0,0]
y_test = data['test'][0,0]['labels'][0,0]
有一个额外的字段'writers'(例如data['train'][0,0]['writers'][0,0]
)来区分原始示例编写器。最后,还有另一个字段 data['mapping']
,但我不确定它将数字映射到什么。
此外,在第 II 节 D 中,EMNIST paper 指出 "the last portion of the training set, equal in size to the testing set, is set aside as a validation set"。奇怪的是,.mat 文件 training/testing 大小与 Table II 中列出的数字不匹配,但它确实匹配图 2 中的大小
val_start = X_train.shape[0] - X_test.shape[0]
X_val = X_train[val_start:X_train.shape[0],:]
y_val = y_train[val_start:X_train.shape[0]]
X_train = X_train[0:val_start,:]
y_train = y_train[0:val_start]
如果您不需要验证集,可以将这些样本留在训练集中。
此外,如果您想将数据重塑为 2D、28x28 大小的图像而不是 1D 784 数组,为了获得正确的图像方向,您需要使用 Fortran 排序进行 numpy 重塑(Matlab 使用列-主要排序,就像 Fortran。reference)。例如-
X_train = X_train.reshape( (X_train.shape[0], 28, 28), order='F')
我建议从 Yann LeCun 网站下载 'Binary format as the original MNIST dataset'。
解压下载的文件然后用Python:
import idx2numpy
X_train = idx2numpy.convert_from_file('./emnist-letters-train-images-idx3-ubyte')
y_train = idx2numpy.convert_from_file('./emnist-letters-train-labels-idx1-ubyte')
X_test = idx2numpy.convert_from_file('./emnist-letters-test-images-idx3-ubyte')
y_test = idx2numpy.convert_from_file('./emnist-letters-test-labels-idx1-ubyte')
另一种解决方案是使用 EMNIST python 包。 (详情请见 https://pypi.org/project/emnist/)
这让您可以在您的环境中 pip install emnist
然后导入数据集(当您第一次 运行 该程序时它们将下载)。
网站示例:
>>> from emnist import extract_training_samples
>>> images, labels = extract_training_samples('digits')
>>> images.shape
(240000, 28, 28)
>>> labels.shape
(240000,)
您还可以列出数据集
>>> from emnist import list_datasets
>>> list_datasets()
['balanced', 'byclass', 'bymerge', 'digits', 'letters', 'mnist']
并用您的选择替换第一个示例中的 'digits'。
这为您提供了 numpy 数组中的所有数据,我发现这些数据很容易处理。
我一直在尝试寻找一种方法来加载 EMNIST-letters 数据集,但没有取得太大成功。我在结构中发现了一些有趣的东西,无法理解正在发生的事情。这就是我的意思:
我下载了 .mat 格式 in here
我可以使用
加载数据import scipy.io
mat = scipy.io.loadmat('letter_data.mat') # renamed for conveniance
这是一本字典,关键字如下:
dict_keys(['__header__', '__version__', '__globals__', 'dataset'])
唯一感兴趣的关键是数据集,我无法从中收集数据。打印它的形状给这个:
>>>print(mat['dataset'].shape)
(1, 1)
我越挖越深,找到了一个看起来有点像真实数据集的形状,并发现了这个:
>>>print(mat['dataset'][0][0][0][0][0][0].shape)
(124800, 784)
这正是我想要的,但我找不到标签和测试数据,我尝试了很多东西但似乎无法理解这个数据集的结构。
如果有人能告诉我这是怎么回事,我将不胜感激
由于数据集的结构方式,可以使用 mat['dataset'][0][0][0][0][0][0]
访问图像数组,使用 mat['dataset'][0][0][0][0][0][1]
访问标签数组。例如,print(mat['dataset'][0][0][0][0][0][0][0])
将打印出第一张图像的像素值,而 print(mat['dataset'][0][0][0][0][0][1][0])
将打印出第一张图像的标签。
对于较少...复杂的数据集,我实际上建议使用 Kaggle 上的 EMNIST 数据集的 CSV 版本:https://www.kaggle.com/crawford/emnist,其中每一行都是一个单独的图像,有 785 列,其中第一列 = class_label,之后的每一列代表一个像素值(28 x 28 图像总共 784 个)。
@Josh Payne 的回答是正确的,但我会针对那些想要使用 .mat 文件并强调典型数据拆分的人对其进行扩展。
数据本身已经被分成训练和测试集。以下是我访问数据的方式:
from scipy import io as sio
mat = sio.loadmat('emnist-letters.mat')
data = mat['dataset']
X_train = data['train'][0,0]['images'][0,0]
y_train = data['train'][0,0]['labels'][0,0]
X_test = data['test'][0,0]['images'][0,0]
y_test = data['test'][0,0]['labels'][0,0]
有一个额外的字段'writers'(例如data['train'][0,0]['writers'][0,0]
)来区分原始示例编写器。最后,还有另一个字段 data['mapping']
,但我不确定它将数字映射到什么。
此外,在第 II 节 D 中,EMNIST paper 指出 "the last portion of the training set, equal in size to the testing set, is set aside as a validation set"。奇怪的是,.mat 文件 training/testing 大小与 Table II 中列出的数字不匹配,但它确实匹配图 2 中的大小
val_start = X_train.shape[0] - X_test.shape[0]
X_val = X_train[val_start:X_train.shape[0],:]
y_val = y_train[val_start:X_train.shape[0]]
X_train = X_train[0:val_start,:]
y_train = y_train[0:val_start]
如果您不需要验证集,可以将这些样本留在训练集中。
此外,如果您想将数据重塑为 2D、28x28 大小的图像而不是 1D 784 数组,为了获得正确的图像方向,您需要使用 Fortran 排序进行 numpy 重塑(Matlab 使用列-主要排序,就像 Fortran。reference)。例如-
X_train = X_train.reshape( (X_train.shape[0], 28, 28), order='F')
我建议从 Yann LeCun 网站下载 'Binary format as the original MNIST dataset'。
解压下载的文件然后用Python:
import idx2numpy
X_train = idx2numpy.convert_from_file('./emnist-letters-train-images-idx3-ubyte')
y_train = idx2numpy.convert_from_file('./emnist-letters-train-labels-idx1-ubyte')
X_test = idx2numpy.convert_from_file('./emnist-letters-test-images-idx3-ubyte')
y_test = idx2numpy.convert_from_file('./emnist-letters-test-labels-idx1-ubyte')
另一种解决方案是使用 EMNIST python 包。 (详情请见 https://pypi.org/project/emnist/)
这让您可以在您的环境中 pip install emnist
然后导入数据集(当您第一次 运行 该程序时它们将下载)。
网站示例:
>>> from emnist import extract_training_samples
>>> images, labels = extract_training_samples('digits')
>>> images.shape
(240000, 28, 28)
>>> labels.shape
(240000,)
您还可以列出数据集
>>> from emnist import list_datasets
>>> list_datasets()
['balanced', 'byclass', 'bymerge', 'digits', 'letters', 'mnist']
并用您的选择替换第一个示例中的 'digits'。
这为您提供了 numpy 数组中的所有数据,我发现这些数据很容易处理。