手写数字识别

您所在的位置:网站首页 cnn手写数字识别代码是什么 手写数字识别

手写数字识别

2024-06-16 21:28:33| 来源: 网络整理| 查看: 265

手写数字识别

数据集和部分代码来自:https://aistudio.baidu.com/aistudio/projectDetail/101813

我们直接进入我们的实现部分; 我们先来本次任务的流程,大部分神经网络也是这个流程: 在这里插入图片描述 接下来我们直接进入数据的处理部分:

#导入需要的包 import numpy as np import paddle as paddle import paddle.fluid as fluid from PIL import Image import matplotlib.pyplot as plt import os #导入必要的包 用飞桨网络作为框架 BUF_SIZE=512 BATCH_SIZE=128 #用于训练的数据提供器,每次从缓存中随机读取批次大小的数据 train_reader = paddle.batch( paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=BUF_SIZE), batch_size=BATCH_SIZE) #用于训练的数据提供器,每次从缓存中随机读取批次大小的数据 test_reader = paddle.batch( paddle.reader.shuffle(paddle.dataset.mnist.test(), buf_size=BUF_SIZE), batch_size=BATCH_SIZE) #用于打印,查看mnist数据 train_data=paddle.dataset.mnist.train(); sampledata=next(train_data()) #next用法:返回迭代器的下一个项目 print(sampledata)

train_reader和test_reader paddle.dataset.mnist.train()和test()分别用于获取mnist训练集和测试集 paddle.reader.shuffle()表示每次缓存BUF_SIZE个数据项,并进行打乱 paddle.batch()表示每BATCH_SIZE组成一个batch 接下来就到了配置网络的部分,本次网络使用的是DNN全连接网络,把每一个神经元都连接在一起,全部连接,所以命名为:全连接网络: 在这里插入图片描述 在这里插入图片描述

# 定义多层感知器 def multilayer_perceptron(input): # 第一个全连接层,激活函数为ReLU hidden1 = fluid.layers.fc(input=input, size=100, act='relu') # 第二个全连接层,激活函数为ReLU hidden2 = fluid.layers.fc(input=hidden1, size=100, act='relu') # 以softmax为激活函数的全连接输出层,输出层的大小必须为数字的个数10 prediction = fluid.layers.fc(input=hidden2, size=10, act='softmax') return prediction

以上我们就定义完了一个简单的全连接网络,两个隐层都是100层,最后全连接输出层为10层,聪明的朋友应该已经想到为什么是十层了,手写数字识别,识别的数字是0-9,固然为10层。 激活函数: Relu: 在这里插入图片描述 接下来就是定义图像输入和获取分类器了 注:本次数据集都为28*28的灰度图:

# 输入的原始图像数据,大小为1*28*28 image = fluid.layers.data(name='image', shape=[1, 28, 28], dtype='float32')#单通道,28*28像素值 # 标签,名称为label,对应输入图片的类别标签 label = fluid.layers.data(name='label', shape=[1], dtype='int64') #图片标签 # 获取分类器 predict = multilayer_perceptron(image)

接下来我们就来定义模型的损失函数,损失函数可以表达出模型的准确性:

#使用交叉熵损失函数,描述真实样本标签和预测概率之间的差值 cost = fluid.layers.cross_entropy(input=predict, label=label) # 使用类交叉熵函数计算predict和label之间的损失函数 avg_cost = fluid.layers.mean(cost) # 计算分类准确率 acc = fluid.layers.accuracy(input=predict, label=label)

acc为成功率 cost为失败 这里使用的交叉熵损 多为分类任务所使用: 在这里插入图片描述

# 获取测试程序 test_program = fluid.default_main_program().clone(for_test=True) #使用Adam算法进行优化, learning_rate 是学习率(它的大小与网络的训练收敛速度有关系) optimizer = fluid.optimizer.AdamOptimizer(learning_rate=0.001) opts = optimizer.minimize(avg_cost)

这里使用的是Adam算法,而不是梯度下降,但其实目的是一样的,都是为了让神经网络更好的收敛。 接下来就开始神经网络的训练了,也就是常说的炼丹:

# 定义使用CPU还是GPU,使用CPU时use_cuda = False,使用GPU时use_cuda = True use_cuda = False place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() exe = fluid.Executor(place) exe.run(fluid.default_startup_program())

因为目标量不大,使用CPU就可以了

feeder = fluid.DataFeeder(place=place, feed_list=[image, label]) #告知网络传入的数据分为两部分,第一部分是image值,第二部分是label值 #定义模型训练曲线 all_train_iter=0 all_train_iters=[] all_train_costs=[] all_train_accs=[] def draw_train_process(title,iters,costs,accs,label_cost,lable_acc): plt.title(title, fontsize=24) plt.xlabel("iter", fontsize=20) plt.ylabel("cost/acc", fontsize=20) plt.plot(iters, costs,color='red',label=label_cost) plt.plot(iters, accs,color='green',label=lable_acc) plt.legend() plt.grid() plt.show()

接下来就是对模型的训练和保存了:

EPOCH_NUM=2 model_save_dir = "/home/aistudio/work/hand.inference.model" for pass_id in range(EPOCH_NUM): # 进行训练 for batch_id, data in enumerate(train_reader()): #遍历train_reader train_cost, train_acc = exe.run(program=fluid.default_main_program(),#运行主程序 feed=feeder.feed(data), #给模型喂入数据 fetch_list=[avg_cost, acc]) #fetch 误差、准确率 all_train_iter=all_train_iter+BATCH_SIZE all_train_iters.append(all_train_iter) all_train_costs.append(train_cost[0]) all_train_accs.append(train_acc[0]) # 每200个batch打印一次信息 误差、准确率 if batch_id % 200 == 0: print('Pass:%d, Batch:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, batch_id, train_cost[0], train_acc[0])) # 进行测试 test_accs = [] test_costs = [] #每训练一轮 进行一次测试 for batch_id, data in enumerate(test_reader()): #遍历test_reader test_cost, test_acc = exe.run(program=test_program, #执行训练程序 feed=feeder.feed(data), #喂入数据 fetch_list=[avg_cost, acc]) #fetch 误差、准确率 test_accs.append(test_acc[0]) #每个batch的准确率 test_costs.append(test_cost[0]) #每个batch的误差 # 求测试结果的平均值 test_cost = (sum(test_costs) / len(test_costs)) #每轮的平均误差 test_acc = (sum(test_accs) / len(test_accs)) #每轮的平均准确率 print('Test:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, test_cost, test_acc)) #保存模型 # 如果保存路径不存在就创建 if not os.path.exists(model_save_dir): os.makedirs(model_save_dir) print ('save models to %s' % (model_save_dir)) fluid.io.save_inference_model(model_save_dir, #保存推理model的路径 ['image'], #推理(inference)需要 feed 的数据 [predict], #保存推理(inference)结果的 Variables exe) #executor 保存 inference model print('训练模型保存完成!') draw_train_process("training",all_train_iters,all_train_costs,all_train_accs,"trainning cost","trainning acc")

以下是训练的结果:在这里插入图片描述 可以看到准确率升高之后开始波动趋于平稳。 这个时候我们就已经得到了训练好的模型了 然后我们就可以对模型进行验证,应用到实际中

#将手写数字转化为符合条件了 28*28的灰度图像(因为我们训练就是使用的28*28图像训练) def load_image(file): im = Image.open(file).convert('L') #将RGB转化为灰度图像,L代表灰度图像,像素值在0~255之间 im = im.resize((28, 28), Image.ANTIALIAS) #resize image with high-quality 图像大小为28*28 im = np.array(im).reshape(1, 1, 28, 28).astype(np.float32)#返回新形状的数组,把它变成一个 numpy 数组以匹配数据馈送格式。 # print(im) im = im / 255.0 * 2.0 - 1.0 #归一化到【-1~1】之间 return im infer_path='/home/aistudio/data/data2304/infer_3.png'#加载好要使用的图像 img = Image.open(infer_path) plt.imshow(img) #根据数组绘制图像 plt.show() #显示图像

在这里插入图片描述

最后一步: 加载模型,图像然后开始预测!:

# 加载数据并开始预测 with fluid.scope_guard(inference_scope): #获取训练好的模型 #从指定目录中加载 推理model(inference model) [inference_program, #推理Program feed_target_names, #是一个str列表,它包含需要在推理 Program 中提供数据的变量的名称。 fetch_targets] = fluid.io.load_inference_model(model_save_dir,#fetch_targets:是一个 Variable 列表,从中我们可以得到推断结果。model_save_dir:模型保存的路径 infer_exe) #infer_exe: 运行 inference model的 executor img = load_image(infer_path) results = infer_exe.run(program=inference_program, #运行推测程序 feed={feed_target_names[0]: img}, #喂入要预测的img fetch_list=fetch_targets) #得到推测结果, # 获取概率最大的label lab = np.argsort(results) #argsort函数返回的是result数组值从小到大的索引值 #print(lab) print("该图片的预测结果的label为: %d" % lab[0][0][-1]) #-1代表读取数组中倒数第一列

在这里插入图片描述 可以看到已经成功预测了,全连接网络的实现就到这里了 但很明显的可以看出全连接网络的缺点,假设输入的图像是1920*780的呢?显然越大越多的数据用全连接网络是耗费时间且不够有效率的,所以敬请关注明天的下一篇,卷积神经网络来解决问题!



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭