大家好,又见面了,我是你们的朋友风君子。
在机器学习入门的领域里,我们会用MNIST数据集来实验各种模型。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数据集中的图片是28X28Pixel,故每一幅图就是1行784(28X28)列的数据,括号中的每一个值代表一个像素。
如果是黑白的图片,图片中的黑色地方数值为0:有图案的地方,数值为0~255之间的数字,代表其颜色的深度。
如果是彩色的图片,一个像素会由3个值来表示RGB(红、黄、蓝)。
刚开始打印的信息是解压数据集的意思。如果是第一次运行,还会显示下载数据的相关信息。接着打印出来的是训练集的图片信息,是一个55000行、784列的矩阵。
训练样本:共60000个,其中55000个用于训练,另外5000个用于验证
测试样本:共10000个
MNIST数据集的组成
在MNIST训练数据集中,mnist.train.images是一个形状为[55000,784]的张量。
其中,第1个维度数字用来索引图片,第2个维度数字用来索引每张图片中的像素点。此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介入0~255之间。
MNIST里包含3个数据集:
- 用于模型训练(mnist.train.images)
- 用于评估训练过程中的准确度(测试数据集)(mnist.test.images)
- 用于评估最终模型的准确度(验证数据集)mnist.validation.images)
训练过程中,模型并没有遇到过验证数据集中的数据,所以利用验证数据集可以评估出模型的准确度。这个准确度越高,代码模型的泛化能力越强。
另外,这3个数据集还有分别对应的3个文件(标签文件),用来标注每个图片上的数字是几。
把图片和标签放在一起,称为“样本”。通过样本就可以实现一个有监督信号的深度学习。相对应的,MNIST数据集的标签是介于0~9之间的数字,用来描述给定图片里表示的数字。
标签数据是“one-hot vectors”:一个one-hot向量,除了某一位的数字是1外,其余各维数字都是0.例如标签0将表示为[1,0,0,0,0,0,0,0,0,0])。如果是one hot格式,也就是上面的代码中的one_hot参数为True,那么每一个用例中的label不再是一个数,而是一个长度为10的数组,该数组中有9个0,只有一个1(注意是一个用例)。比如如果是手写字3, 那么对于one hot格式,就变成[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]。one hot编码格式在多分类模型中使用到。其他的格式不变。
代码
import numpy as np
import os
# 训练集
with open'./minist_data/train-images.idx3-ubyte') as f:
loaded = np.fromfilefile = f, dtype = np.uint8)
train_data = loaded[16:].reshape60000, 784))
printtrain_data.shape) # 60000, 784)
with open'./minist_data/train-labels.idx1-ubyte') as f:
loaded = np.fromfilefile = f, dtype = np.uint8)
train_labels = loaded[8:]
printtrain_labels.shape) # 60000,)
# 测试集
with open'./minist_data/t10k-images.idx3-ubyte') as f:
loaded = np.fromfilefile=f, dtype=np.uint8)
test_data = loaded[16:].reshape10000, 784))
printtest_data.shape) # 10000, 784)
with open'./minist_data/t10k-labels.idx1-ubyte') as f:
loaded = np.fromfilefile=f, dtype=np.uint8)
test_labels = loaded[8:].reshape10000))
printtest_labels.shape) # 10000,)
可以看到,训练集有六万条样本,784个特征。测试集一万条样本。
TensorFlow的封装让使用MNIST数据集变得更加方便。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。在MNIST数据集中的每一张图片都代表了0~9中的一个数字。图片的大小都为28*28,且数字都会出现在图片的正中间。
具体读取代码如下:
import tensorflow as tf
import matplotlib.pyplot as plt
''' 读取MNIST数据方法一'''
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets'MNIST_data',one_hot=True)
'''1)获得数据集的个数'''
train_nums = mnist.train.num_examples
validation_nums = mnist.validation.num_examples
test_nums = mnist.test.num_examples
print'MNIST数据集的个数')
print' >>>train_nums=%d' % train_nums,'\n',
'>>>validation_nums=%d'% validation_nums,'\n',
'>>>test_nums=%d' % test_nums,'\n')
'''2)获得数据值'''
train_data = mnist.train.images #所有训练数据
val_data = mnist.validation.images #5000,784)
test_data = mnist.test.images #10000,784)
print'>>>训练集数据大小:',train_data.shape,'\n',
'>>>一副图像的大小:',train_data[0].shape)
'''3)获取标签值label=[0,0,...,0,1],是一个1*10的向量'''
train_labels = mnist.train.labels #55000,10)
val_labels = mnist.validation.labels #5000,10)
test_labels = mnist.test.labels #10000,10)
print'>>>训练集标签数组大小:',train_labels.shape,'\n',
'>>>一副图像的标签大小:',train_labels[1].shape,'\n',
'>>>一副图像的标签值:',train_labels[0])
'''4)批量获取数据和标签【使用next_batchbatch_size)】'''
batch_size = 100 #每次批量训练100幅图像
batch_xs,batch_ys = mnist.train.next_batchbatch_size)
print'使用mnist.train.next_batchbatch_size)批量读取样本\n')
print'>>>批量读取100个样本:数据集大小=',batch_xs.shape,'\n',
'>>>批量读取100个样本:标签集大小=',batch_ys.shape)
#xs是图像数据100,784);ys是标签100,10)
'''5)显示图像'''
plt.figure)
for i in range100):
im = train_data[i].reshape28,28)
im = batch_xs[i].reshape28,28)
plt.imshowim,'gray')
plt.pause0.0000001)
plt.show)
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
MNIST数据集的个数
>>>train_nums=55000
>>>validation_nums=5000
>>>test_nums=10000
>>>训练集数据大小: 55000, 784)
>>>一副图像的大小: 784,)
>>>训练集标签数组大小: 55000, 10)
>>>一副图像的标签大小: 10,)
>>>一副图像的标签值: [ 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
使用mnist.train.next_batchbatch_size)批量读取样本
>>>批量读取100个样本:数据集大小= 100, 784)
>>>批量读取100个样本:标签集大小= 100, 10)
参考:
http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html
https://blog.csdn.net/panrenlong/article/details/81736754