MNIST二进制数据集探索--基于Numpy处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011240016/article/details/81949100

话不多说,先上代码,参考博客地址:

https://blog.csdn.net/qq_32166627/article/details/62218072

import numpy as np 
import struct
import cv2

def loadImageSet(filename):
    binfile = open(filename, 'rb') # 读取二进制文件
    buffers = binfile.read()

    head = struct.unpack_from('>IIII', buffers, 0) # 读取前四个整数,返回一个元组

    offset = struct.calcsize('>IIII') # 定位到data开始的位置
    imageNum = head[1] # 拿到图片数量
    width = head[2]
    height = head[3]

    bits = imageNum * width * height
    bitsString = '>' + str(bits) + 'B' # fmt格式:'>47040000B'

    imgs = struct.unpack_from(bitsString, buffers, offset) # 取data数据,返回一个元组

    binfile.close()

    imgs = np.reshape(imgs, [imageNum, width * height]) # reshape为[60000,784]型的数组

    return imgs, head

def loadLabelSet(filename):
    binfile = open(filename, 'rb') # 读取二进制文件
    buffers = binfile.read()

    head = struct.unpack_from('>II', buffers, 0) # 读取label文件前两个整形数

    labelNum = head[1]
    offset = struct.calcsize('>II') # 定位到label数据开始的位置
    numString = '>' + str(labelNum) + 'B' # fmt格式:'>60000B'
    labels = struct.unpack_from(numString, buffers, offset) # 取label数据

    binfile.close()

    labels = np.reshape(labels, [labelNum])

    return labels, head


def main():
    train_data_filename = "./datasets/mnist/train-images-idx3-ubyte"
    train_label_filename = "./datasets/mnist/train-labels-idx1-ubyte"

    test_data_filename = "./datasets/mnist/t10k-images-idx3-ubyte"
    test_label_filename = "./datasets/mnist/t10k-labels-idx1-ubyte"


    imgs, data_head = loadImageSet(train_data_filename)

    print(type(imgs))
    print("images_array", imgs)
    print(imgs.shape)

    # 随机取出10个图像的像素点数据,可视化来看一看
    for i in range(10):
        idx = np.random.randint(6000)
        pick_one_image = np.reshape(imgs[idx,:],[28,28]) # 某一行的所有列就是一个图片的像素值
        cv2.imwrite("./datasets/test"+ str(i) + ".jpg", pick_one_image)

    print("data_head: ", data_head)

    ##### 现在看一看labels数据 ######
    labels, labels_head = loadLabelSet(train_label_filename)
    print("labels_head",labels_head)
    print(type(labels))
    print("labels_shape",labels.shape)

    print("label: ", labels[0])

if __name__ == "__main__":
    main()

MNIST数据集下载下来:

  • t10k-images-idx3-ubyte(.gz是压缩,解压后是这个,有些是.idx3,这是二进制,没有什么大问题)
  • t10k-labels-idx1-ubyte
  • train-images-idx3-ubyte
  • train-labels-idx1-ubyte

代码实现功能是:

  • 解析二进制数据,变成Numpy数组
  • 通过OpenCV-Python输出来看看

最后想说,转成Numpy数组以后,就很容易转成Tensorflow的数据填充进来训练手写识别啦。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u011240016/article/details/81949100