如何用python解析mnist图片

MNIST 数据集是一个手写数字识别训练数据集,来自美国国家标准与技术研究所National Institute of Standards and Technology (NIST)。训练集 (training set) 由来自 250 个不同人手写的数字构成,其中 50% 是高中学生,50% 来自人口普查局 (the Census Bureau) 的工作人员。测试集(test set) 也是同样比例的手写数字数据。

MNIST 数据集可在 http://yann.lecun.com/exdb/mnist/ 获取, 它包含了四个部分:

  • Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
  • Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
  • Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
  • Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)

因数据集是按特殊格式压缩存储的,所以如果在训练或应用模型时想看一下原图就会比较困难,本文讲解如果反向解析这个数据集。

一、mnist数据结构

可以看出在train-images.idx3-ubyte中,第一个数为32位的整数(魔数,图片类型的数),第二个数为32位的整数(图片的个数),第三和第四个也是32为的整数(分别代表图片的行数和列数),接下来的都是一个字节的无符号数(即像素,值域为0~255),因此,我们只需要依次获取魔数和图片的个数,然后获取图片的长和宽,最后逐个像素读取就可以了。

如何使用python解析数据呢? 首先需要安装python的图形处理库PIL,这个库支持像素级别的图像处理,对于学习数字图像处理有很大的帮助。安装完成之后,就可以进行图像的解析了。

sudo pip install Pillow   #PIL python image library

首先打开文件,然后分别读取魔数,图片个数,以及行数和列数,在struct中,可以看到,使用了’>IIII’,这是什么意思呢?意思就是使用大端规则,读取四个整形数(Integer),如果要读取一个字节,则可以用’>B’(当然,这里用没用大端规则都是一样的,因此只有两个或两个以上的字节才有用)。

什么是大端规则呢?不懂的可以百度一下,这个不再赘述(http://baike.baidu.com/link?url=Bgg8b0vRr3b_SeGyOl8U4DmAbIQT9swGuNtD_21ctEI_NliqsQ-mKF73YT90EILF2EQy50mEua_M4z6Cma3rmK)

然后对于每张图片,先创建一张空白的图片,其中的’L’代表这张图片是灰度图,最后逐个像素读取,然后写进空白图片里,最后保存图片,就可以了

二、mnist标签数据结构

可以发现,与上面的非常相似,只不过这里每一个字节变成了标签而已(标签大小为0~9)

三、解析mnist图片和标签数据

好了,通过上述讲解,最后我们可以通过python将mnist解析出来了,看一下效果:

解析出的图片数据:

解析出的label:

程序源代码如下:

#!/usr/bin/env python # -*- coding: utf-8 -*- from PIL import Image import struct #import matplotlib.pyplot as plt #import numpy as np # 读取mnist图片 def read_image(filename): f = open(filename, 'rb') index = 0 buf = f.read() f.close() numRows = 28 numColumns = 28

阅读全文

小猪学Paddle—线性回归之房价预测

上次我们进行了简单的环境安装和模型应用尝试,今天开始通过paddlepaddle的房价预测看一下简单的线性回归有监督模型是怎么训练出来的。

简单点说就是根据一份有标注的数据集,包含了某地区房屋的相关信息(feature)及该类房屋的标注平均价格(label),用来训练一个可以根据feature预测label的模型。具体数据字段一共14个,包含13个feature和1个label,含义如下:

属性名 解释 类型
CRIM 该镇的人均犯罪率 连续值
ZN 占地面积超过25,000平方呎的住宅用地比例 连续值
INDUS 非零售商业用地比例 连续值
CHAS 是否邻近 Charles River 离散值,1=邻近;0=不邻近
NOX 一氧化氮浓度 连续值
RM 每栋房屋的平均客房数 连续值
AGE 1940年之前建成的自用单位比例 连续值
DIS 到波士顿5个就业中心的加权距离 连续值
RAD 到径向公路的可达性指数 连续值
TAX 全值财产税率 连续值
PTRATIO 学生与教师的比例 连续值
1000(BK – 0.63)^2,其中BK为黑人占比 连续值
LSTAT 低收入人群占比 连续值
MEDV 同类房屋价格的中位数 连续值

数据示例:

整个训练过程大概分为读取数据集、定义网络结构/cost损失函数/训练参数/训练优化器、进行多轮模型迭代训练、选择训练误差最小的模型、应用模型。具体就不再赘述了,可以先阅读一下paddlepaddle的文档:http://www.paddlepaddle.org/docs/develop/book/01.fit_a_line/index.cn.html

下边是训练过程的代码和自己的理解注释,有错误欢迎指正:

vim housing_train.py #!/usr/bin/env python # -*- coding: utf-8 -*- import os import paddle.v2 as paddle import paddle.v2.dataset.uci_housing as uci_housing with_gpu = os.getenv('WITH_GPU', '0') != '0' def main(): # 0.init paddle初始化定义跑模型的设备 paddle.init(use_gpu=with_gpu, trainer_count=1) # 1.读取data数据

阅读全文

小猪学Paddle—安装和训练示例

官网:http://www.paddlepaddle.org/

Github:https://github.com/PaddlePaddle/Paddle

中文手册:http://www.paddlepaddle.org/docs/develop/documentation/fluid/zh/getstarted/index_cn.html

安装和测试过程:

#On CentOS 7 su root #安装依赖 yum install python python-devel -y pip install --upgrade pip --default-timeout 600 #安装paddlepaddle pip install paddlepaddle --default-timeout 600 #创建测试脚本 mkdir /home/work/paddle && cd /home/work/paddle vim housing.py import

阅读全文