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

page73 往下。

接昨天,显示图片调用了Image.fromarray(np.uinit8(img)) 函数

google 了一下np.uint8 的含义,其实就是8位的无符号整型。

https://www.runoob.com/numpy/numpy-dtype.html


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

有时间再研究下图片和uint8 的关系,这里有描述:http://tonysyu.github.io/scikit-image/user_guide/data_types.html, 这里说了,图片就是np 阵列,np阵列可以支持各种数据类型。

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

在PIL image 和 np.array 之间的转换关系:

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

  1. nparray to pil image
from PIL import Image
image_from_array = Image.fromarray(nd_array)

2.pil image from numpy

from PIL import Image
PIL_image = Image.fromarray(numpy_image.astype('uint8'), 'RGB')


3. pil image to numpy

>>> pix = numpy.array(pic)

好的,继续。

2.6.2 神经网络的推理处理

我们对这个MNIST 数据集实现神经网络的推理处理。神经网络的输入层有784个神经元,输出层有10个神经元。输入层的784这个数字来源于图像大小的28*28 =784,输出层的10个数字来源于10类别分类(数字0-9,共10类别。)

此外,这个神经网络有2个隐藏层,第1个隐藏层有50个神经元,第2个隐藏层有100个神经元。这个50 和 100可以设置为任何值。下面我们先定义get_data()、init_network()、predict() 这3个函数.

代码:ch03/neuralnet_minist.py

# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


def get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
return x_test, t_test


def init_network():
with open("sample_weight.pkl", 'rb') as f:
network = pickle.load(f)
return network


def predict(network, x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']

a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = softmax(a3)

return y


x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
y = predict(network, x[i])
p= np.argmax(y) # 最も確率の高い要素のインデックスを取得
if p == t[i]:
accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))%

看下上面的函数,和之前看到的函数类似。

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

https://www.toutiao.com/article/7114087460019159584/ 里的处理过程



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


  • get_data() 主要从MNIST库中获取训练集和测试集数据,并返回测试集数据

return x_test, t_test , 这里返回的是测试集阵列及标签数据。

  • init_network() : 先做network的初始化,设置偏置函数, 返回初始值队列network.

这里open("sample_weight.pkl", 'rb') 里面包含的其实就是针对这个识别场景已经预制好的权重参数,这个文件是字典变量形式保存了权重和偏置参数。

  • forward(network,x): 主要做阵列的阶乘,并返回预测。


主函数在下面这一段,


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

首先获得MNIST 数据集合,生成网络,接着用for语句逐一取出保存在x中的图像数据,用predict()函数进行分类。predict()函数以Numpy 数组的形式输出各个标签对应的概率。比如输出[0.1,0.3,0.2,...,0.04]的数组,该数组表示“0“的概率为0.1,"1"的概率为0.3。然后我们取出这个概率列表中最大值的索引。(np.argmax(y))表示第几个元素的概率最高。

最后比较这个数值和有正确解的标注(t[i])。最后比较神经网络所预测的答案和正确解标签,将回答正确的概率作为识别精度。

执行上面的代码后,会显示Accuracy:0.9352


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

在这个例子中,我们把Load_mnist函数的参数normalize 设置成了True。将normalize 设置成True后,函数内部会进行转换,将图像的各个像素值除以255,使得数据的值在0.0-1.0的范围内。像这样把数据限定到某个范围内的处理称为正规化(normalization)此外,对神经网络的输入数据进行某种既定的转换称为预处理(pre-processing).这里,作为对输入图像的一种预处理。

预处理在神经网络(深度学习)中非常实用,其有效性已在提高识别性能和学习的效率等众多实验中得到证明。在刚才的例子中,作为一种预处理,我们将各个像素值除以255,进行了简单地正规化。实际上,很多预处理都会考虑到数据的整体分布,比如利用数据整体的均值或标准差,移动数据,使数据整体以0为中心分布,或者进行正规化,把数据的延展控制在一定范围内。除此之外,还有将数据整体的分布形状均匀化的方法,即数据白化(whitening)等。


今天主要用代码实现了对数字的图像识别,MNIST数据集、有固定的训练好的参数。看到page75,明天继续。

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

相关文章

推荐文章