读取MNIST数据集的几种方法

机器学习中处理MNIST数据集相当于编程语言中的"hello world",其中训练集中包含60000 个examples, 测试集中包含10000个examples。数据为像素28*28=784的图像,标签为0-9等10个数字标签。
为方便处理,我们希望输出的数据为(x_train,y_train),(x_test,y_test)四个数组,其中x_train包含了60000个维度为784的向量表示图像,将标签进行one-hot编码,比如将数字标签2编码为[0,0,1,0,0,0,0,0,0,0]这样的数组,因此y_test包含60000个维度为10的向量表示对应的标签。如下:
在这里插入图片描述
下面介绍几种读取MNIST的方法。

本地文件读取

读取.gz压缩文件

MNIST官网下载数据集,即四个.gz文件,如下

#!/usr/bin/env python
# coding=utf-8
'''
@Author: John
@Email: johnjim0816@gmail.com
@Date: 2020-05-21 23:36:58
@LastEditor: John
@LastEditTime: 2020-05-22 07:24:45
@Discription: 
@Environment: python 3.7.7
'''
import numpy as np
from struct import unpack
import gzip

def __read_image(path):
    with gzip.open(path, 'rb') as f:
        magic, num, rows, cols = unpack('>4I', f.read(16))
        img=np.frombuffer(f.read(), dtype=np.uint8).reshape(num, 28*28)
    return img

def __read_label(path):
    with gzip.open(path, 'rb') as f:
        magic, num = unpack('>2I', f.read(8))
        lab = np.frombuffer(f.read(), dtype=np.uint8)
        # print(lab[1])
    return lab
    
def __normalize_image(image):
    img = image.astype(np.float32) / 255.0
    return img

def __one_hot_label(label):
    lab = np.zeros((label.size, 10))
    for i, row in enumerate(lab):
        row[label[i]] = 1
    return lab

def load_mnist(x_train_path, y_train_path, x_test_path, y_test_path, normalize=True, one_hot=True):
    
    '''读入MNIST数据集
    Parameters
    ----------
    normalize : 将图像的像素值正规化为0.0~1.0
    one_hot_label : 
        one_hot为True的情况下,标签作为one-hot数组返回
        one-hot数组是指[0,0,1,0,0,0,0,0,0,0]这样的数组
    Returns
    ----------
    (训练图像, 训练标签), (测试图像, 测试标签)
    '''
    image = {
        'train' : __read_image(x_train_path),
        'test'  : __read_image(x_test_path)
    }

    label = {
        'train' : __read_label(y_train_path),
        'test'  : __read_label(y_test_path)
    }
    
    if normalize:
        for key in ('train', 'test'):
            image[key] = __normalize_image(image[key])

    if one_hot:
        for key in ('train', 'test'):
            label[key] = __one_hot_label(label[key])

    return (image['train'], label['train']), (image['test'], label['test'])

x_train_path='./Mnist/train-images-idx3-ubyte.gz'
y_train_path='./Mnist/train-labels-idx1-ubyte.gz'
x_test_path='./Mnist/t10k-images-idx3-ubyte.gz'
y_test_path='./Mnist/t10k-labels-idx1-ubyte.gz'
(x_train,y_train),(x_test,y_test)=load_mnist(x_train_path, y_train_path, x_test_path, y_test_path)

读取解压的文件

即将四个.gz文件解压,这种读取方式有很多种,如下:

在线读取

使用tensorflow读取

tensor中的keras模块已经集成了mnist相关处理方式,如下:

from keras.datasets import mnist
from keras.utils import np_utils
import numpy as np

def load_data():  # categorical_crossentropy
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    number = 10000
    x_train = x_train[0:number]
    y_train = y_train[0:number]
    x_train = x_train.reshape(number, 28 * 28)
    x_test = x_test.reshape(x_test.shape[0], 28 * 28)
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')

    # convert class vectors to binary class matrices
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)
    x_test = np.random.normal(x_test)  # 加噪声
    
    x_train,x_test= x_train / 255,x_test / 255

    return (x_train, y_train), (x_test, y_test)

(x_train, y_train), (x_test, y_test) = load_data()

使用python-mnist模块

python中也集成了相关的在线模块,点击查看方法

### 回答1: b'\xe5\xb7\xb4\xe6\xb3\x95\xe4\xba\x91esp8266 app inventor' 是一个关于使用 ESP8266 微控制器和 App Inventor 进行开发的项目。其中,ESP8266 微控制器是一种基于 Wi-Fi 的芯片,而 App Inventor 则是一种可视化的应用程序开发平台。这个项目的目的是让开发者能够利用 ESP8266 的 Wi-Fi 功能和 App Inventor 的图形用户界面快速地开发出具有 wifi 功能的应用程序。 ### 回答2: 巴法云ESP8266是一种物联网云平台基于ESP8266芯片设计的解决方案。通过它,用户可以通过云端与设备进行通信,实现智能家居和智能办公等应用。该平台的设计带有易用性、开发快速等特点,能够降低智能硬件入门门槛和开发成本。 另外,巴法云ESP8266与App Inventor的结合也为广大用户带来了便利。App Inventor是一款App开发平台,使用它可以非常快速地开发Android应用程序,而巴法云ESP8266作为一种物联网云平台也是可编程的,两者结合使用可以实现一系列有趣的应用。 使用巴法云ESP8266和App Inventor,用户可以创造许多有趣的项目,例如: 1. 智能家居控制:用户能够通过App Inventor设计App,通过与巴法云ESP8266平台集成硬件,实现家居设备的智能控制。 2. 温湿度监测:用户能够使用ESP8266传感器进行温湿度测量,通过巴法云ESP8266将数据上传到云端,在App Inventor中设计好数据可视化等功能,实现温湿度监测。 3. 智能饮水机:用户可以通过巴法云ESP8266平台和App Inventor将饮水机与互联网连接起来,实现智能化的制水、出水控制,并且能够通过App进行远程操控。 总之,巴法云ESP8266和App Inventor的结合使得智能家居和物联网应用的开发更为轻松,为所有爱好者提供了更加便利和高效的开发体验。无论是学生还是业余爱好者,都可使用这种可靠的底层平台实现自己的创意。 ### 回答3: 巴法云ESP8266是一种基于 ESP8266 Wi-Fi模块 的智能硬件,具有极高的可编程性和灵活性,在智能家居、物联网等方面有着广泛的应用。在巴法云ESP8266开发板的控制下,用户可以轻松地控制家居设备、智能灯等设备,实现智能化管理。而通过 App Inventor,则可使得智能设备操作变得更加简单、高效。 对于巴法云ESP8266的开发,需要具备一定的硬件知识,并且需要掌握一些编程和应用开发的技能。而App Inventor是一款非常优秀的免费平台,可以帮助用户完成各种应用的开发,特别是移动应用的开发。通过App Inventor可以轻松对巴法云ESP8266开发板进行控制。 一般来说,使用App Inventor开发巴法云ESP8266应用的主要步骤如下: 1. 准备好一台电脑和一个巴法云ESP8266的开发板,然后下载安装App Inventor,进行注册和登录。 2. 创建一个新的应用,选择一个属于巴法云ESP8266的模板。 3. 通过可视化编程的方式,添加巴法云ESP8266的控制界面,设置对应的控制命令和响应事件。 4. 保存应用并连接到巴法云ESP8266开发板,进行测试和调试。 通过这样的方式,可以快速地开发出一款集中控制智能设备的应用程序。此外,App Inventor还具有更多的开发模板和插件,可以进一步增加应用程序的功能和灵活性。 总之,巴法云ESP8266和App Inventor这两个工具都为智能家居和物联网的开发提供了非常好的支持和帮助。通过这些工具,我们不仅可以提升智能设备的性能和功能,还能为智能生活带来更多的便利。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值