python 读取 MNIST 数据集,并解析为图片文件

MNIST 是 Yann LeCun 收集创建的手写数字识别数据集,训练集有 60,000 张图片,测试集有 10,000 张图片。数据集链接为:http://yann.lecun.com/exdb/mnist/。数据集下载解压后有4个二进制 IDX 文件:

train-images-idx3-ubyte: 训练集图片
train-labels-idx1-ubyte: 训练集标签
t10k-images-idx3-ubyte:  测试集图片
t10k-labels-idx1-ubyte:  测试集标签

其中图像文件的数据格式为:

TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

文件头信息包含 4 个 unsinged int32 整型数据,分别是 魔数、图片数、图片宽度、图片长度。后面的数据是所有图像的像素的,每个byte一个像素点。图片的长宽都是 28,所以每张图片长度为 28*28。像素值取值范围是 0~255。

可以使用 python 的 struct 模块读取二进制数据,将图像像素转为 numpy 矩阵,因而可以使用下面的函数解析图像数据:

import struct
import numpy as npdef decode_idx3_ubyte(idx3_ubyte_file):with open(idx3_ubyte_file, 'rb') as f:print('解析文件:', idx3_ubyte_file)fb_data = f.read()offset = 0fmt_header = '>iiii'    # 以大端法读取4个 unsinged int32magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, fb_data, offset)print('魔数:{},图片数:{}'.format(magic_number, num_images))offset += struct.calcsize(fmt_header)fmt_image = '>' + str(num_rows * num_cols) + 'B'images = np.empty((num_images, num_rows, num_cols))for i in range(num_images):im = struct.unpack_from(fmt_image, fb_data, offset)images[i] = np.array(im).reshape((num_rows, num_cols))offset += struct.calcsize(fmt_image)return images

标签数据文件的格式为:

TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  60000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label

文件头是两个 unsinged int32 整型数据:魔数和标签数,后面每一个 byte 是一个标签值,标签值为 0~9。同样使用 struct 读取:

import structdef decode_idx1_ubyte(idx1_ubyte_file):with open(idx1_ubyte_file, 'rb') as f:print('解析文件:', idx1_ubyte_file)fb_data = f.read()offset = 0fmt_header = '>ii'  # 以大端法读取两个 unsinged int32magic_number, label_num = struct.unpack_from(fmt_header, fb_data, offset)print('魔数:{},标签数:{}'.format(magic_number, label_num))offset += struct.calcsize(fmt_header)labels = []fmt_label = '>B'    # 每次读取一个 bytefor i in range(label_num):labels.append(struct.unpack_from(fmt_label, fb_data, offset)[0])offset += struct.calcsize(fmt_label)return labels

解析出了图像像素和标签值后,就可以使用 cv2 模块将像素矩阵保存为图像文件,根据标签值保存在不同的目录下:

import numpy as np
import os
import cv2def check_folder(folder):"""检查文件文件夹是否存在,不存在则创建"""if not os.path.exists(folder):os.mkdir(folder)print(folder)else:if not os.path.isdir(folder):os.mkdir(folder)def export_img(exp_dir, img_ubyte, lable_ubyte):"""生成数据集"""check_folder(exp_dir)images = decode_idx3_ubyte(img_ubyte)labels = decode_idx1_ubyte(lable_ubyte)nums = len(labels)for i in range(nums):img_dir = os.path.join(exp_dir, str(labels[i]))check_folder(img_dir)img_file = os.path.join(img_dir, str(i)+'.png')imarr = images[i]cv2.imwrite(img_file, imarr)def parser_mnist_data(data_dir):train_dir = os.path.join(data_dir, 'train')train_img_ubyte = os.path.join(data_dir, 'train-images-idx3-ubyte')train_label_ubyte = os.path.join(data_dir, 'train-labels-idx1-ubyte')export_img(train_dir, train_img_ubyte, train_label_ubyte)test_dir = os.path.join(data_dir, 'test')test_img_ubyte = os.path.join(data_dir, 't10k-images-idx3-ubyte')test_label_ubyte = os.path.join(data_dir, 't10k-labels-idx1-ubyte')export_img(test_dir, test_img_ubyte, test_label_ubyte)if __name__ == '__main__':data_dir = 'mnist_data/'parser_mnist_data(data_dir)

最后得到具有如下目录结构的数据集:

mnist_data/|----train/|----0/|----0.png|----1/|----1.png
...|----test/
...

解析出具有下面形式的图像数据:

python 读取 MNIST 数据集,并解析为图片文件相关推荐

  1. Python读取MNIST数据集

    MNIST数据集下载地址:http://yann.lecun.com/exdb/mnist/ 读取MINST数据集第一张图像并显示 # coding=utf-8 import numpy as np ...

  2. python读取windows日志_Python解析windows系统日志文件

    DOM是Document Object Model的简称,XML 文档的高级树型表示.该模型并非只针对 Python,而是一种普通XML 模型.Python 的 DOM 包是基于 SAX 构建的,并且 ...

  3. 将MNIST数据集转换成.jpg图片

    MNIST数据集简介 # MNIST 数据集合共包含70000张手写数字图片 # 其中60000张用作训练集 # 10000张用作预测集 # 数据集包含了0-9共10类手写数字图片,每张 # 图片都做 ...

  4. 读取mnist数据集方法大全(train-images-idx3-ubyte.gz,train-labels.idx1-ubyte等)(python读取gzip文件)

    文章目录 gzip包 keras读取mnist数据集 本地读取mnist数据集 下载数据集 解压读取 方法一 方法二 gzip包读取 读取bytes数据 注:import导入的包如果未安装使用pip安 ...

  5. 项目:机器学习+FLD分类+python图像处理mnist数据集

    机器学习+FLD分类+python图像处理mnist数据集 ** 以mnist数据集实现Fisher Linear Discriminant(FLD)的分类以及降维功能 任务一如下所示 以下任务是te ...

  6. 基于jupyter notebook的python编程-----MNIST数据集的的定义及相关处理学习

    基于jupyter notebook的python编程-----MNIST数据集的相关处理 一.MNIST定义 1.什么是MNIST数据集 2.python如何导入MNIST数据集并操作 3.接下来, ...

  7. (超详细)读取mnist数据集并保存成图片

    mnist数据集介绍.读取.保存成图片 1.mnist数据集介绍: MNIST数据集是一个手写体数据集,简单说就是一堆这样东西  MNIST的官网地址是 MNIST; 通过阅读官网我们可以知道,这个数 ...

  8. Python读取CIFAR10数据集,附代码详解

    Python读取CIFAR10数据集 初次接触机器学习,用到的第一个数据集就是CIFAR10.这是一个小型数据集.一共包含 10 个类别的 RGB 彩色图 片:飞机( airplane ).汽车( a ...

  9. python处理MNIST数据集

    1. MNIST数据集 1.1 MNIST数据集获取 MNIST数据集是入门机器学习/模式识别的最经典数据集之一.最早于1998年Yan Lecun在论文: Gradient-based learni ...

最新文章

  1. rhel6.2 yum
  2. Nagios各组件简述及nrpe详解
  3. Kafka核心概念及核心机制
  4. C语言求m以内奇数的和
  5. eclipse svn插件安装_eclipse 2020-03 (4.15.0) SVN 插件在线安装教程
  6. 微积分的发现是人类精神的最高胜利
  7. 起始之家网站的辅助教程值不值得买
  8. python---字符串的拼接、去重、反转、字母花样排序、单词出现判断、统计文件特定单词频率lambda、硬盘容量、列表转字符串
  9. FPGA之JESD204B接口——总体概要 实例 中
  10. 是时候抛弃 Svelte、React 和 VUE 了吗?
  11. 计算机网络cpu规格,国产CPU路漫漫 历数龙芯各型号技术指标
  12. 基于python的网络聊天室论文_Python基于Socket实现简单聊天室
  13. LiveData更新数据报错java.lang.IllegalStateException: Cannot invoke setValue on a background thread
  14. windows10 使用老版图片查看器
  15. HY-SRF05超声波测距
  16. Linux下lsb_release命令的安装教程
  17. 计算list的字节数/mb数
  18. Wireshark学习十:应用Wireshark显示过滤器分析特定数据流(下)
  19. 在浙江php就业岗位,找工作的小伙伴快看过来!浙江多地最新教师就业岗位信息来了...
  20. wma转mp3怎么弄_wma格式怎么转换mp3?用音频转换软件转换文件原来这么简单

热门文章

  1. Treeview使用方法
  2. Android面试自我介绍
  3. 产品经理书籍推荐:《写给大家看的设计书 第3版》
  4. 能上网,但访问不了B站,wegame页面空白
  5. java之学习记录 3 - 2 - jquery
  6. 今天发布视频-现代黄河三角洲
  7. saltstack配置管理数据系统
  8. cmmi 生产率和质量模型_多台显示器和生产率
  9. 韦东山老师的单片机核心课程学习笔记(二)
  10. GDUTacmtrain-3.A