minist 简介

在机器学习入门的领域里,我们会用MNIST数据集来实验各种模型。MNIST里包含各种手写数字图片。也包含每张图片对应的标签,告诉我们这个数字几。(MNIST数据集来自美国国家标准与技术研究所,NationalInstituteofStandardsandTechnology(NIST)。训练集(trainingset)由来自250个不同人手写的数字构成,…

大家好,又见面了,我是你们的朋友全栈君。

       在机器学习入门的领域里,我们会用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 个标签)

每张图片都经过了大小归一化和居中处理.该数据集的图片是一个黑白的单通道图片,其中图片如下: 

minist 简介

说明

       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.fromfile(file = f, dtype = np.uint8)
    train_data = loaded[16:].reshape((60000, 784))
print(train_data.shape) # (60000, 784)


with open('./minist_data/train-labels.idx1-ubyte') as f:
    loaded = np.fromfile(file = f, dtype = np.uint8)
    train_labels = loaded[8:]
print(train_labels.shape) # (60000,)


# 测试集
with open('./minist_data/t10k-images.idx3-ubyte') as f:
    loaded = np.fromfile(file=f, dtype=np.uint8)
    test_data = loaded[16:].reshape((10000, 784))
print(test_data.shape) # (10000, 784)

with open('./minist_data/t10k-labels.idx1-ubyte') as f:
    loaded = np.fromfile(file=f, dtype=np.uint8)
    test_labels = loaded[8:].reshape((10000))
print(test_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_batch(batch_size)】'''
batch_size = 100    #每次批量训练100幅图像
batch_xs,batch_ys = mnist.train.next_batch(batch_size)
print('使用mnist.train.next_batch(batch_size)批量读取样本\n')
print('>>>批量读取100个样本:数据集大小=',batch_xs.shape,'\n',
      '>>>批量读取100个样本:标签集大小=',batch_ys.shape)
#xs是图像数据(100,784);ys是标签(100,10)

'''5)显示图像'''
plt.figure()
for i in range(100):
    im = train_data[i].reshape(28,28)
    im = batch_xs[i].reshape(28,28)
    plt.imshow(im,'gray')
    plt.pause(0.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_batch(batch_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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125439.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • laravel validate 设置为中文(验证提示为中文)

    laravel validate 设置为中文(验证提示为中文)

    2021年10月23日
  • ipsec iptables_iptables -p

    ipsec iptables_iptables -piptablesiptables[-t表名]命令选项[链名][条件匹配][-j目标动作或跳转]-t表名可以省略,指定规则存放在哪个表中,默认为filter表用于存放相同功能的规则filter表:负责过滤功能能,nat表:网络地址转换功能mangle表:拆解报文做出修改并重新封装的功能raw表:关闭nat表上启用的连接追踪机制命令选项-A在…

  • c语言位运算符解释_c语言逻辑关系运算符

    c语言位运算符解释_c语言逻辑关系运算符      位操作是程序设计中对位模式按位或二进制数的一元和二元操作,在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。按位取反:~’~’是一元运算符,用来对一个二进制数按位取反,把0变为1,把1变为0。如下例子所示。…

  • DHCP Option 60 的理解

    DHCP Option 60 的理解

    2021年11月28日
  • linux17:时间间隔计算脚本练习——距离你的生日还有多少天

    linux17:时间间隔计算脚本练习——距离你的生日还有多少天需求距离一个未来的日子还有多少天距离一个过去的日子过去多少天#!/bin/bash#name——timeDistance.sh#function#input a date, to calculate how many days to this day#2022.1.18 daxiongread -p “please input your date like YYYYMMDD ex>20150716 : ” date2#test whether or not have

  • 静态代理和动态代理的理解一样吗_动态代理原理怎么理解

    静态代理和动态代理的理解一样吗_动态代理原理怎么理解Java静态代理静态代理通常用于对原有业务逻辑的扩充。比如持有二方包的某个类,并调用了其中的某些方法。然后出于某种原因,比如记录日志、打印方法执行时间,但是又不好将这些逻辑写入二方包的方法里。所以可以创建一个代理类实现和二方方法相同的方法,通过让代理类持有真实对象,然后在原代码中调用代理类方法,来达到添加我们需要业务逻辑的目的。这其实也就是代理模式的一种实现,通过对真实对象的封装

    2022年10月16日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号