EMNIST数据集简介

后期将更新对此数据集处理的代码

文章链接: EMNIST: an extension of MNIST to handwritten letters

数据集下载链接: [Download]

Python3 提取 EMNIST 原图源码见我的 github : https://github.com/anlongstory/data_process/tree/master

下面对 EMNIST 做一个简单的介绍。

NIST 与 MNIST

NIST 全称为 NIST Speical Database 19,全数据集包含了 80 多万张图片,MNIST 则是 NIST 数据集的缩减版,因为 NIST 数据集的存储方式,及数据分类构成比较难用,而 MNIST 作为 NIST 的子集,则图片量更少,且仅含有数字,更易操作。

NIST 是收集了 超过 500 个人的手写字母/数字,对它们进行黑白扫描做成的,NIST 总共按照不同的分法共分成 5 类:

  • By_page:里面含有未经处理的整页的字符黑白扫描
  • By_Author: 里面根据不同的书写者,将属于同一个人的所有字符都归成一类
  • By_Field: 分成字母,数字,可以用于字母或者数字分割
  • By_Class: 按类别,即 数字 10 类[0-9],26 类 [a-z],26 类 [A-Z],共 62 类
  • By_Merge: 因为有的因为字母,大小写手写体基本很难分辨,所有这里将这些字母大小写合并,又构成一个新的分类,被合并的字母有 15 类 [C,I,J,K,L,M,O,P,S,U,V,W,X,Y,Z],所以最后最剩下 47 类

而在 By_Class 和 By_Merge 两种分类方法所有 814255 张图片中,有超过半数的是数字,而英文字母根据它们在英文中使用习惯的问题,出现的频率也不是一样的。

MNIST 这里就不多展开了,相信大家很熟悉了。

EMNIST

名字的由来为,Extended MNIST (EMNIST), 因为 MNIST 被大家熟知,但是目前 MNIST 上的精度已经很高了,一个好的数据集应该更具挑战性,所以这里就推出了 EMNIST ,一个在手写字体分类任务中更有挑战的 Benchmark 。

在数据集接口上,此数据集的处理方式跟 MNIST 保持一致,也是为了方便已经熟悉 MNIST 的我们去使用,这里着重介绍一下 EMNIST 的分类方式。

分类方式

前面介绍,因为语言及使用习惯的问题,数字比字母多,而字母之间也有差异,所以 EMNIST 主要分为以下 5 类:

  • By_Class : 共 814255 张,62 类,与 NIST 相比重新划分类训练集与测试机的图片数
  • By_Merge: 共 814255 张,47 类, 与 NIST 相比重新划分类训练集与测试机的图片数
  • Balanced : 共 131600 张,47 类, 每一类都包含了相同的数据,每一类训练集 2400 张,测试集 400 张
  • Digits :共 28000 张,10 类,每一类包含相同数量数据,每一类训练集 24000 张,测试集 4000 张
  • Letters : 共 145600 张,26 类,每一类包含相同数据,每一类训练集5600 张,测试集 800 张
  • MNIST : 共 70000 张,10 类,每一类包含相同数量数据(注:这里虽然数目和分类都一样,但是图片的处理方式不一样,EMNIST 的 MNIST 子集数字占的比重更大)

这里做一个简单的比较:

n0rFOvM
original MNIST
YLFs7Gt
EMNIST MNIST

而且,论文中有做实验比较,original MNIST 和 EMNIST MNIST,多个不同结构的网络均在 EMNIST MNIST 上表现更好,因为其字母所占比例更大,更多特征可以被抓住。

w8Hg5Tm

注:这里 Letters 类是 26 类,是大小写字母组合在一起的,每一类训练集 4800 张,测试集 800 张,论文中有错误。

### EMNIST 数据集简介 EMNIST 数据集是对经典 MNIST 数据集的扩展,包含了更多的字符类别,不仅限于数字 0 到 9,还增加了大写字母、小写字母和其他符号。该数据集广泛应用于手写字符识别任务中[^1]。 EMNIST 提供了几种不同的变体,每种变体都有特定的应用场景: - **ByClass**: 包含所有可能的字符类别的平衡分布。 - **ByMerge**: 将某些容易混淆的小写字母与大写字母合并。 - **Balanced**: 平衡了每个类别的样本数量。 - **Letters**: 只包含字母(不区分大小写)。 - **Digits**: 类似于原始 MNIST 数据集,仅包含数字。 - **MNIST**: 原始 MNIST 数据集的子集。 --- ### 下载和加载 EMNIST 数据集的方法 #### 使用 TensorFlow Datasets 加载 EMNIST TensorFlow Datasets (TFDS) 是一种简单的方式来下载并加载常用的数据集。以下是通过 TFDS 获取 EMNIST 数据集的具体方法: ```python import tensorflow_datasets as tfds # 加载 EMNIST 数据集中的 'balanced' 版本 (ds_train, ds_test), ds_info = tfds.load( 'emnist/balanced', split=['train', 'test'], shuffle_files=True, as_supervised=True, with_info=True ) def normalize_img(image, label): """将图像标准化到 [0, 1] 范围""" return tf.cast(image, tf.float32) / 255., label # 对数据进行预处理 ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE) ds_train = ds_train.cache().shuffle(ds_info.splits['train'].num_examples).batch(128).prefetch(tf.data.AUTOTUNE) ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE) ds_test = ds_test.batch(128).cache().prefetch(tf.data.AUTOTUNE) ``` 以上代码展示了如何使用 `tensorflow_datasets` 来加载 EMNIST 数据集,并对其进行基本的预处理操作,例如归一化和批量化[^2]。 --- #### 手动下载 EMNIST 数据集 如果需要手动下载 EMNIST 数据集,可以访问其官方存储位置或相关资源链接。通常情况下,可以通过以下方式完成: 1. 访问官方网站或其他可信源获取 `.gz` 文件压缩包。 2. 解压文件后读取其中的二进制数据。 以下是一个简单的 Python 实现来解析这些文件: ```python from PIL import Image import numpy as np import gzip import idx2numpy # 定义路径 file_path_images = './data/emnist-balanced-train-images-idx3-ubyte.gz' file_path_labels = './data/emnist-balanced-train-labels-idx1-ubyte.gz' # 解压并加载数据 with gzip.open(file_path_images, 'rb') as f: images = idx2numpy.convert_from_file(f) with gzip.open(file_path_labels, 'rb') as f: labels = idx2numpy.convert_from_file(f) # 显示第一个图像及其标签 img = Image.fromarray(np.uint8(images[0].T)) print(f"Label: {labels[0]}") img.show() ``` 此脚本演示了如何解压 `.gz` 文件并将它们转换为 NumPy 数组以便进一步分析[^3]。 --- ### 应用实例:构建一个简单的 CNN 模型 一旦成功加载了 EMNIST 数据集,便可以用它训练神经网络模型。这里给出一个基础卷积神经网络的例子: ```python import tensorflow as tf model = tf.keras.models.Sequential([ tf.keras.layers.InputLayer(input_shape=(28, 28, 1)), tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu'), tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(units=128, activation='relu'), tf.keras.layers.Dense(units=len(ds_info.features['label'].names), activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) history = model.fit(ds_train, epochs=10, validation_data=ds_test) ``` 这段代码定义了一个小型 CNN 架构,并对其进行了编译和训练过程设置[^4]。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值