模型训练之数据集操作:矩阵变换

对神经网络技术有所了解的人应该都知道,要想训练一个高性能的神经网络模型,除了神经网络本身的设计之外,还一个非常重要的前提就是数据集的质量问题;因此,打造一个高质量的数据集就是一个必不可少的过程。 但具体怎么才能开发一个合格的数据集,这时就离不开对数据集的各种操作;而由于在神经网络中,数据的主要载体是多维数组,也就是矩阵;因此一般情况下,数据集的数据格式也会以矩阵的形式存在。 而学会对矩阵的操作就是一个必不可少的技能之一;下面我们就以MINST数据集为例,来简单介绍一下对数据集的操作过程。

对神经网络技术有所了解的人应该都知道,要想训练一个高性能的神经网络模型,除了神经网络本身的设计之外,还一个非常重要的前提就是数据集的质量问题;因此,打造一个高质量的数据集就是一个必不可少的过程。

但具体怎么才能开发一个合格的数据集,这时就离不开对数据集的各种操作;而由于在神经网络中,数据的主要载体是多维数组,也就是矩阵;因此一般情况下,数据集的数据格式也会以矩阵的形式存在。

而学会对矩阵的操作就是一个必不可少的技能之一;下面我们就以MINST数据集为例,来简单介绍一下对数据集的操作过程。

模型训练之数据集操作:矩阵变换

数据集操作

MINST数据集是一个经典的数据集,其内容是一个手写数字识别的数据集;对学习神经网络技术的人来说,手写数字识别就相当于编程入门中的Hello World。

因此,了解MINST数据集也是学习神经网络技术的入门课程之一。

关于MINST数据集的下载方式,基本有两种选择;一种是自己手动下载,另一种是从pytorch官网下载,使用PyTorch的数据集API即可下载。

复制
from torchvision import datasets
# 执行以下代码即可从pytorch官网下载minst数据集到本地data目录
datasets.MNIST(root='data', train=True, download=True)

MINST数据集主要有四个压缩文件组成,分别由train开头的图片数据(images)和标签数据(labels);以及t10k开头的测试图片数据(t10k-images)和标签数据(t10k-labels)组成。

模型训练之数据集操作:矩阵变换

MNIST数据集的具体内容是由0〜9手写数字图片和数字标签所组成的,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。如下图所示。

模型训练之数据集操作:矩阵变换

由于下载的MINST数据集文件是已经处理好的矩阵格式,并且用二进制格式存储,因此无法直接使用文本工具打开。

而我们可以使用python提供的numpy工具包,或者pytorch提供的工具包来读取数据。

复制
import numpy as np
import gzip


with gzip.open("./MNIST/train-images-idx3-ubyte.gz", 'rb') as f:    
  x_train = np.frombuffer(f.read(), np.uint8, offset=16)    
  print("MINST数据集信息打印, 数据集内容:%s, 类型: %s, 长度: %s, 矩阵数据类型: %s, 形状: %s, 大小:%s, 维度: %s" % (x_train, type(x_train), len(x_train), x_train.dtype, x_train.shape, x_train.size, x_train.ndim))

以上代码输出结果如下,可以明显看出读取结果是一个一维数组;并且长度为47040000;不是说数据集是六万个28*28的手写数字图片吗?为什么会是一个47040000长度的一维数组。

模型训练之数据集操作:矩阵变换

原因就在于此数据集是经过处理之后的数据集,为了存储方便使用一维数组最简单;因此,在使用过程中需要把数据变换成一个三维矩阵,也就是升维的操作;47040000 / (28 * 28) = 60000。

复制
import numpy as np
import gzip
with gzip.open("./MNIST/train-images-idx3-ubyte.gz", 'rb') as f:
    x_train = np.frombuffer(f.read(), np.uint8, offset=16)
    print("MINST数据集信息打印, 数据集内容:%s, 类型: %s, 长度: %s, 矩阵数据类型: %s, 形状: %s, 大小:%s, 维度: %s" % (x_train, type(x_train), len(x_train),
        x_train.dtype, x_train.shape, x_train.size, x_train.ndim))    
    # 矩阵变换
    x_train = x_train.reshape(-1, 28, 28)
    print("MINST数据集信息变换之后打印, 数据集内容:%s, 类型: %s, 长度: %s, 矩阵数据类型: %s, 形状: %s, 大小:%s, 维度: %s" % (    x_train, type(x_train), len(x_train),    x_train.dtype, x_train.shape, x_train.size, x_train.ndim))

结果如下图所示:

模型训练之数据集操作:矩阵变换

经过变换之后,打印矩阵并显示图片:

复制
import numpy as np
import gzip
from PIL import Image
with gzip.open("./MNIST/train-images-idx3-ubyte.gz", 'rb') as f:
    x_train = np.frombuffer(f.read(), np.uint8, offset=16)    
    print("MINST数据集信息打印, 数据集内容:%s, 类型: %s, 长度: %s, 矩阵数据类型: %s, 形状: %s, 大小:%s, 维度: %s" % (x_train, type(x_train), len(x_train),          x_train.dtype, x_train.shape, x_train.size, x_train.ndim))    
    x_train = x_train.reshape(-1, 28, 28)    
    print("MINST数据集信息变换之后打印, 数据集内容:%s, 类型: %s, 长度: %s, 矩阵数据类型: %s, 形状: %s, 大小:%s, 维度: %s" % (    x_train, type(x_train), len(x_train),    x_train.dtype, x_train.shape, x_train.size, x_train.ndim))    
    print(len(x_train), x_train[0])    
    # 转换为图片 并显示    
    pil_img = Image.fromarray(np.uint8(x_train[0]))    
    pil_img.show()

执行以上代码 用户即可输出手写数字图片。

相关资讯

从一个简单的神经网络模型开始

关于神经网络的文章写的也不少了,但一直没弄明白神经网络到底是怎么运作的;而现有的神经网络模型又太复杂,如Transformer,CNN,RNN,以及各种应用场景(NLP,CV,分类任务,回归任务等等);导致我们无法看到神经网络最本质的东西。 所以,今天我们就来从最简单的神经网络开始学起。 简单神经网络神经网络的基本原理很简单,那就是模仿由人类大脑神经元构成的神经网络;神经元结构如下图所示:上图是生物学中神经元的基本结构,神经元由树突和轴突以及细胞核组成;而不同神经元之间通过轴突进行连接;当然这些都是中学生物学的基础,就不多说了。

再谈什么是神经网络,透过现象看本质

面对着网络上各种各样关于神经网络的内容,很多想学习神经网络的人都无从下手,包括作者自己;面对各种乱七八糟的概念,名词,很多人都被这些东西蒙住了眼睛。 所以,今天我们就抛开各种高大上的概念,从本质出发来学习什么网络;我们今天不讨论CNN,RNN,Transformer,LSTM等各种神经网络架构;只讨论什么是神经网络。 神经网络对神经网络有过了解的人应该都知道,神经网络就是仿生学的一种实现,使用的是数学模型模拟人类的大脑神经系统;具体的可以看一下上一篇文章——从一个简单的神经网络模型开始。

怎么实现一个神经网络?神经网络的组成结构

对学习神经网络技术的人来说,自己设计一个神经网络模型是很多人都想做的事情;也是神经网络技术学习过程中必不可少的一个环节;但是很多人又不知道应该怎么下手。 所以今天就介绍一下怎么设计一个神经网络模型。 实现一个神经网络很多人认为神经网络复杂的原因是因为没有了解过神经网络的组成结构;因此,就很难弄清楚神经网络模型中每个环节的作用,所以我们就先从神经网络的结构入手。