mnist数据集介绍

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 个标签)

#用代码看一下数据集的形状
from tensorflow.examples.tutorials.mnist import input_data
 
# 载入数据集,如果根目录有就调用,没有就下载
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
 
print('训练数据集')
print(mnist.train.images.shape)
print(mnist.train.labels.shape)
print('验证数据集')
print(mnist.validation.images.shape)
print(mnist.validation.labels.shape)
print('测试数据集')
print(mnist.test.images.shape)
print(mnist.test.labels.shape)
#结果如下:
训练数据集
(55000, 784)
(55000, 10)
验证数据集
(5000, 784)
(5000, 10)
测试数据集
(10000, 784)
(10000, 10)

也就是说images集是由28*28像素的图片组成,源文件都是字节文件,我们写个脚本看一下就行。

from tensorflow.examples.tutorials.mnist import input_data
import scipy.misc
import matplotlib.pyplot as plt
import os
 
# 载入数据集,如果根目录有就调用,没有就下载
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
img=mnist.train.images[0,:].reshape(28,28)
def mnist_plot_img(img):
    (rows, cols) = img.shape
    plt.figure()
    plt.gray()
    plt.imshow(img)
    plt.show()
mnist_plot_img(img) 

运行结果可以看出是7

labels是onehot(独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。)编码的标签,0-9一共十个状态所以他就是一个十维,打印一个看一下,由图可知刚刚打印的数字是七。

print(mnist.train.labels[0,:])

在这里插入图片描述

以上就是mnist训练集的内容。

input_data模块:

def read_data_sets(train_dir,
                   fake_data=False, 
                   one_hot=False, 
                   dtype=tf.float32):

**dtype:**的作用是将图像像素点的灰度值从[0, 255]转变为[0.0, 1.0]

定义好之后看提取数据模块,之前的分析都是使用的写好的方法,现在看一下这些方法是如何实现的。

def extract_images(filename):
  """Extract the images into a 4D uint8 numpy array [index, y, x, depth]."""
  print('Extracting', filename)
  with gzip.open(filename) as bytestream:
    magic = _read32(bytestream)
    if magic != 2051:
      raise ValueError(
          'Invalid magic number %d in MNIST image file: %s' %
          (magic, filename))
    num_images = _read32(bytestream)
    rows = _read32(bytestream)
    cols = _read32(bytestream)
    buf = bytestream.read(rows * cols * num_images)
    data = numpy.frombuffer(buf, dtype=numpy.uint8)
    data = data.reshape(num_images, rows, cols, 1)
    return data

文件描述

结合代码和文件结构很容易看出:代码中_read32()的作用是从文件流中动态读取4位数据并转换为uint32的数据。

image文件的前四位为魔术码(magic number),只有检测到这4位数据的值和2051相等时,才代表这是正确的image文件,才会继续往下读取。接下来继续读取之后的4位,代表着image文件中,所包含的图片的数量(num_images)。再接着读4位,为每一幅图片的行数(rows),再后4位,为每一幅图片的列数(cols)。最后再读接下来的rows * cols * num_images位,即为所有图片的像素值。最后再用reshape方法将读取到的所有像素值装换为[index, rows, cols, depth](depth=1表示一维空间,彩色是在处理的时候是三维空间RGB)的矩阵。这样就将全部的image数据读取了出来。reshape很有意思如果你不知道图片总数量的话第一个值可以用-1代替,意思就是有一个有很多图片像素用?784表示,把这个矩阵,变换成2828的不知道多少个的矩阵

同理标签集也是这样读取的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值