读书笔记-深度学习入门-(8)

从page69 往下继续。

3.6 手写数字识别

介绍完神经网络的结构之后,现在我们来试着解决实际问题。这里我们来进行手写数字图像的识别。我们使用学习到的参数,先实现神经网络的“推理处理”,这个推理处理也叫做前向传播。(forward propagation)

机器学习问题的步骤是:学习+推理两个阶段。使用神经网络解决问题时,需要首先使用训练数据(学习数据)进行权重参数的学习;进行推理时,使用刚才学习到的参数,对输入数据进行分类。

3.6.1 MNIST 数据集

这里使用的数据集是MNIST手写数字图像集。MNIST 数据集是由0到9的数字图像构成的(下图)。训练图像有6万张,测试图像有1万张,这些图像可以用于学习和推理。


读书笔记-深度学习入门-(8)

MNIST图像数据集的例子

MNIST 数据集的一般使用方法是,先用训练图像进行学习,再用学习到的模型度量能在多大程度上对测试图像进行正确的分类。

MNIST的图像数据是28像素*28像素的灰度图像(1通道),各个像素的取值在0到255之间,每个图像数据都相应的标有“7”, “2”,“1”等标签。

像素,为影像显示的基本单位,译自英文“pixel”,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示“画像元素”之意,有时亦被称为pel(picture element)。每个这样的消息元素不是一个点或者一个方块,而是一个抽象的取样。仔细处理的话,一幅影像中的像素可以在任何尺度上看起来都不像分离的点或者方块;但是在很多情况下,它们采用点或者方块显示。每个像素可有各自的颜色值,可采三原色显示,因而又分成红、绿、蓝三种子像素(RGB色域),或者青、品红、黄和黑(CMYK色域,印刷行业以及打印机中常见)。照片是一个个取样点的集合,在影像没有经过不正确的/有损的压缩或相机镜头合适的前提下,单位面积内的像素越多代表分辨率越高,所显示的影像就会接近于真实物体。

单通道的0到255的图像是灰度图,即用0~255中256中颜色表示,一般0表示纯黑,255表示纯白。 中间的颜色是由黑慢慢变白,即数字的增长即为亮度的增长。 0~255的灰度图像变到0-1的二值图像,这个过程叫二值化。

本书提供了Python脚本mnist.py,该脚本支持从下载MNIST数据集到将这些数据转换成NumPy数组等处理(mnist.py在dataset目录下)。使用mnist.py时,当前目录必须是ch01,ch02,ch03... ch08目录中的一个,使用mnist.py中的load_mnist()函数,就可以按照下述方式轻松读入MNIST数据:


读书笔记-深度学习入门-(8)

从git 下载源代码


执行脚本:

import sys,os

sys.path.append(os.pardir)
from dataset.mnist import load_mnist

(x_train,t_train),(x_test,t_test) = load_mnist(flatten=True,normalize=False)

print(x_train.shape) #(60000,784)
print(t_train.shape) #(60000,)
print(x_test.shape) #(10000,784)
print(t_test.shape) #(10000,)


执行效果如下图所示

读书笔记-深度学习入门-(8)

用来读入MNIST 图像的文件在作者提供的源代码的dataset目录下,因此需要从父目录dataset目录中导入文件,为此需要添加sys.path.append(os.pardir) 词句。

在python中如何导入父目录下的任何目录中的文件sys.path.append(os.pardir) 使用情形: 当需要导入的文件不在当前目录下时,而在父目录的另一个文件夹中就可以使用此函数。 实际就是把父目录加入到sys.path(Python的搜索模块的路径集)中,从而可以导入父目录下的任何目录中的文件。

load_minist函数以“(训练图像、训练标签),(测试图像,测试标签)”的形式返回读入的MNIST数据。此外还可以像 load_minist(normalize=True,flattern=True,one_hot_label=False)这样,设置3个参数。

第一个参数normalize设置是否将输入图像正规化为0.0-1.0的值,如果将该参数设置为False,则输入图像像素会保持原来的0-255. 第二个参数flatten 设置是否展开输入图像(变成一维数组)。如果将该参数设置为False,则输入图像为1*28*28 的三维数组;若设置为True,则输入图像会保存为由784个元素构成的一维数组。第3个参数one_hot_label设置是否将标签保存为one-hot表示(one-hot representation).one-hot 表示是仅正确解标签为1,其余皆为0的数组,就像[0,0,1,0,0,0,0,0,0,0]这样。当one_hot_label 为False时,只是像7、2 这样简单保存正确解标签;当one_hot_label为True时,标签则保存为one-hot表示。


读书笔记-深度学习入门-(8)

源码中调用Pickle加载保存过的文件


读书笔记-深度学习入门-(8)

源码初始化的时候,调用pickle方法,把远程数据存储到本地。


Python有个pickle这个遍历的功能。这个功能可以将程序中的对象保存为文件,如果加载保存过的pickle文件,可以立刻复原之前程序运行中的对象。用于读入MNIST数据集的load_minist()函数内部也使用了pickle功能。


现在我们试着显示MNIST 图像,同时也确认下数据。图像的显示使用PIL(Python Image Library)模块,执行下述代码后,训练图像的第一张就会显示出来,

import sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image

def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()

(x_train,t_train),(x_test,t_test) = load_mnist(flatten=True,normalize=False)
img = x_train[0]
label = t_train[0]
print(label)

print(img.shape)
img = img.reshape(28,28)
print(img.shape)
img_show(img)
读书笔记-深度学习入门-(8)

程序运行效果图

读书笔记-深度学习入门-(8)

展示了图片

这里需要注意的是,flatten = True 时读入的图像是以一列(一维)Numpy 数组的形式保存的。因此,显示图片的时候,需要把它变为原来的28像素*28 像素的形状。可以通过reshape()方法的参数指定期望的形状,更改Numpy数组的形状。

此外,还需要把保存为Numpy数组的图像数据转换为PIL用的数据对象,这个转换处理由Image.fromarray()来完成。

像素,為影像顯示的基本單位,譯自英文「pixel」,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示「畫像元素」之意,有時亦被稱為pel(picture element)。 每个这样的訊息元素不是一个点或者一个方块,而是一个抽象的取樣。

关于image.fromarray() 函数用法,参考这里:

https://blog.csdn.net/weixin_39450145/article/details/103874310


读书笔记-深度学习入门-(8)


今天主要准备代码比较麻烦,看到page 73。明天继续。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章