联系我们
- 地 址:北京市海淀区北四环西路9号 ,主 营:人脸识别,活体检测,身份证识别,银行卡识别,名片识别,车牌识别,OCR识别等及智能识别技术。
- 电 话:13146317170 廖经理
- 传 真:
- 邮 箱:398017534@qq.com
基于深度学习的手写数字识别技术
基于深度学习的手写数字识别技术
由于Python有pickle功用,把对象转化为一个文件。所以在第二次及以后读入数据的时分速度会很快。
假如对Python的pickle功用有兴味,能够讯问心爱的度娘。
--------显现一副图像以考证这个数据集--------
如今写一个程序,显现一张图片,以证明这个数据集下载胜利并且是有效的。
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):
#把img数组转化成Image能够读取的对象
pil_img = Image.fromarray(np.uint8(img))
#显现这个图片对象
pil_img.show()
#得到数据集
#flatten=True代表需求得到1维的数据,normalize=False代表不要正轨化(0-1之间)
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True,
normalize=False)
img = x_train[0]
label = t_train[0]
print(label) # 5
print(img.shape) # (784,)
#由于数据被1维化了,所以此处需求把维度转化为28*28的图像尺寸
img = img.reshape(28, 28) # 把图像的外形变成原来的尺寸
print(img.shape) # (28, 28)
img_show(img)
这是寄存这个代码的位置:
运转胜利之后:
数据的获取及考证局部就这样完成了。下面停止神经网络的推理处置。
--------神经网络的推理--------
引见下这个神经网络的构成:
输入层:28*28=784个神经元
输出层:0-9一共10个分类。所以有10个神经元。
此外,这个神经网络有2个躲藏层,第1个躲藏层有50个神经元,
第2个躲藏层有100个神经元。这个50和100能够设置为任何值。
推理过程与《深度学习理论根底10-完成一个3层神经网络》的区别在于,
之前的权重是乱写的,而本节的权重是锻炼出来的(当然,不是我们锻炼的,这节只担任直接拿来用),
由于这些权重是有效的,所以我们能够在本节看到效果,要想看到效果,也就是正确率,
就需求写一个这个神经网络预测的结果与实践结果的差距,这也是本节需求完成的程序。
下面梳理一下需求做的事情:
1.准备一个获取数据集的函数
2.准备一个获取权重信息的函数
3.准备一个经过数据集及权重信息停止推理的神经网络函数
4.准备一个统计真实结果与预测结果相同数量的函数
5.运转主函数,查看效果
做这些之前,先导入必要的模块
from yuan.dataset.mnist import load_mnist
import pickle
import numpy as np
为了便当操作,yuan文件夹已被制造成模块(在此文件夹加一个空的__init__.py文件即可)
另外,神经网络的推理需求激活函数,之前的章节曾经完成过:
#躲藏层激活函数
def sigmoid_function(x):
return 1/(1+np.exp(-x))
#输出层激活函数
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
做完这些,开端我们的方案
第一步,准备一个获取数据集的函数
# 1.准备一个获取数据集的函数
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
第二步,准备一个获取权重信息的函数
# 2.准备一个获取权重信息的函数
def get_weight():
#你应该保证sample_weight.pkl文件的途径是正确的
#这个文件就是实例经过pickle模块的dumps打包之后的文件(这里我们直接拿来用)
sample_weight_path='./yuan/ch03/sample_weight.pkl'
with open(sample_weight_path, 'rb') as f:
#把这个文件重新复原成了实例
network = pickle.load(f)
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
#返回了各层的权重和偏置
return W1, W2, W3, b1, b2, b3
第三步,准备一个经过数据集及权重信息停止推理的神经网络函数
# 3.准备一个经过数据集及权重信息停止推理的神经网络函数
# 这个过程也叫前向传播(forward propagation)
def forward_propagation(x,network):
W1, W2, W3, b1, b2, b3=network
a1 = np.dot(x, W1) + b1
z1 = sigmoid_function(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid_function(a2)
a3 = np.dot(z2, W3) + b3
y = softmax(a3)
return y
第四步,准备一个统计真实结果与预测结果相同数量的函数
# 4.准备一个统计真实结果与预测结果相同数量的函数
def get_accuracy():
network=get_weight()
x, t = get_data()
#这个变量用于记载正确的预测数量
accuracy_cnt = 0
for i in range(len(x)):
#逐一预测结果
y = forward_propagation(x[i],network)
p = np.argmax(y) # 获取概率最高的元素的索引
#对预测结果与真实结果比照
if p == t[i]:
accuracy_cnt += 1
#返回正确比例
return str(float(accuracy_cnt) / len(x))
第五步,运转主函数,查看效果
# 5.运转主函数,查看效果
def main():
Accuracy=get_accuracy()
print(Accuracy) #输出0.9352
if __name__=='__main__':
main()
最后的0.9352就是这个模型的正确率。每1000个数字图片它能认识935个。
不错不错。这个成果以至超越幼儿园小朋友了。
前几年神经网络刚呈现的时分,我在果壳看到图像辨认的报道几乎吓尿了。这太强大了。
没想到此刻我也写出了这样的程序(实践状况是直接拿他人数据和模型来用----->吹嘘历来不脸红)。
为了榨干numpy的最后一滴血,接下来停止图片的批处置。
(由于np有一些强大的算法很合适批量处置,比用循环一张一张的处置快很多。)
--------批处置--------
预警:矩阵积乘没学好的,请回炉重造。批处置正是经过矩阵积乘的办法停止的。
上图是方才停止单张图片推理的表示图。
输入其实能够看做1行,784列的矩形。最终输出一个1行10列的矩阵。
批处置,我们要做的局部就是把输入变成多行784列。这样,输出也会变成多行10列。
就像下面这样:
这样在第四步,有了一个替代计划:
#4_2.批处置图像结果
def batch_get_accuracy():
network=get_weight()
x, t = get_data()
#这个变量用于记载正确的预测数量
batch_size = 100 # 批数量
accuracy_cnt = 0
for i in range(0, len(x), batch_size):
x_batch = x[i:i + batch_size]
y_batch = forward_propagation(x_batch,network )
p = np.argmax(y_batch, axis=1)
accuracy_cnt += np.sum(p == t[i:i + batch_size])
#返回正确比例
return str(float(accuracy_cnt) / len(x))
能够看到,循环次数减少了100倍(由于步长变成了100)
forward_propagation(x_batch,network ) 这一步,就像上面的图片所描绘的一样,会返回100*10的外形
np.argmax(y_batch, axis=1)则担任把每一行的最大值的索引取出来(也就是最大约率所在的索引位置,即预测结果)
t[i:i + batch_size]则是从正确的答案中截取一截。
所以p == t[i:i + batch_size]的本质是一串预测值与一串真实值比拟。其bool结果之和就是正确数量。
上一条:一种自动识别护照的技术
下一条:双目活体人脸抓拍一体机