keras深度学习框架通过简单神经网络实现手写数字识别

   背景

     keras深度学习框架,并不是一个独立的深度学习框架,它后台依赖tensorflow或者theano。大部分开发者应该使用的是tensorflow。keras可以很方便的像搭积木一样根据模型搭出我们需要的神经网络,然后进行编译,训练,测试,预测。

    今天介绍的手写数字识别实验,主要是熟悉keras搭建神经网络的流程,以及大体的思路。现如今,手写数字识别实验的代码各种各样,对于初学者而言,我们需要的是类似helloworld那样简单的示例。通过示例,我们可以了解神经网络的搭建过程。

    这里使用的手写数字识别,通过搭建网络,构建模型,最后保存模型,然后我们加载模型,通过真实的图片来预测,也检验一下神经网络的能力。

     这里手写数字识别数据来源于官方自带mnist数据集,这个数据集包含60000个训练集和10000个测试集。每个数据是由28 * 28 = 784个矩阵元素组成。所以我们自己用来测试的图片最后应该也要按照这个28*28的尺寸来制作,并且最后进行预测predict的时候,也要像训练集或者测试集一样,把图片转为一个784元素的数组。

    准备代码

import keras
import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Activation
from tensorflow.keras import datasets, utils
import matplotlib.pyplot as plt(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()
x_train = x_train.reshape((-1, 28*28))
x_train = x_train.astype('float32')/255
x_test = x_test.reshape((-1, 28*28))
x_test = x_test.astype('float32')/255y_train = utils.to_categorical(y_train, num_classes=10)
y_test = utils.to_categorical(y_test, num_classes=10)print('x_train.shape', x_train.shape)
print('x_test.shape', x_test.shape)
print('y_train.shape', y_train.shape)
print('y_test.shape', y_test.shape)
"""
layer = [Dense(32, input_shape=(784,)),Activation('relu'),Dense(10),Activation('softmax')]model = Sequential(layer)
"""
model = Sequential()
# model.add(Dense(units=784, activation="relu", input_dim=784))
model.add(Dense(512, activation="relu", input_shape=(28*28, )))
model.add(Dense(10, activation="softmax"))model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.summary()history = model.fit(x_train, y_train, epochs=5, batch_size=128, validation_data=(x_test, y_test))acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label="Training accuracy")
plt.plot(epochs, val_acc, 'b', label="Validation accuracy")
plt.title('Training and Validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
model.save("mnist.h5")
prediction = model.predict(x_test[:1], batch_size=32)
print(x_test[:1])
print(y_test[:1])
print(prediction)
print(np.argmax(prediction, axis=1))

    这个代码在引入了相关库之后,进行的第一件事就是数据处理:

(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()
x_train = x_train.reshape((-1, 28*28))
x_train = x_train.astype('float32')/255
x_test = x_test.reshape((-1, 28*28))
x_test = x_test.astype('float32')/255
y_train = utils.to_categorical(y_train, num_classes=10)
y_test = utils.to_categorical(y_test, num_classes=10)print('x_train.shape', x_train.shape)
print('x_test.shape', x_test.shape)
print('y_train.shape', y_train.shape)
print('y_test.shape', y_test.shape)

     我们的数据集x_train,x_test就是我们的图片数据,这个数据是784个元素组成的数组,我们先进行转矩阵,然后对像素点取模,得到0-1之间的值。我们代码最后打印了x_test[:1],可以看看它的样子:

    这里我们还使用了utils.to_categorical(y_test,num_classes=10) 对我们的目标进行了one-hot转码。通过这个图我们也看到了,数字 7 转了one-hot编码之后,变为了[0,0,0,0,0,0,0,1,0,0]。

    这个代码构建了一个简单的神经网络,也就两层,

     第一层输入层 Dense(512,activation="relu",input_shape=(28*28, ))  #512个节点,relu激活函数,输入形状或者维度 28*28=784。代码中也给出了另一种通过input_dim来指定维度的方法,意思是一样的,但是那种写法model.add(Dense(units=784, activation="relu", input_dim=784))指定的网络节点units=784。这个数字可以随便定义。手写数字识别里面,设置512,784都可以。

    第二层输出层 Dense(10, activation="softmax") #这里指定对应十个分类,也就是数字0,1,2,3,4,5,6,7,8,9的个数。手写数字识别是一个多分类问题。

     没有隐藏层,也没有其他的Dropout。就是简单神经网络。

     另外,代码中还给出了一种构建神经网络的办法:

layer = [Dense(32, input_shape=(784,)),Activation('relu'),Dense(10),Activation('softmax')]model = Sequential(layer)

    意思是一样的,只不过,这里units=32,也就是输入层由32个神经网络节点组成。 

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.summary()

    这是编译神经网络和打印神经网络概要。

    编译神经网络传入loss="categorical_cressentropy" 表示损失函数求的是交叉熵。optimizer="adam",表示优化器是adam,表示自适应算法,另外,也有可能会看到sgd,随机梯度下降算法,或者rmsprop也是一种自适应算法。metrics=["accuracy"]统计指标,这里指定成功率。 

   通过model.summary()我们可以看到神经网络节点信息: 

   

history = model.fit(x_train, y_train, epochs=5, batch_size=128, validation_data=(x_test, y_test))

    这里是把训练和测试神经网络放在一起了,我们传入的validation_data指定了测试数据集。如果不指定validation_data,那么后面,我们通过model.evaluate(x_test,y_test) 也可以得到loss,acc等数据。

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label="Training accuracy")
plt.plot(epochs, val_acc, 'b', label="Validation accuracy")
plt.title('Training and Validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

    我们通过matplot来展示acc,val_acc等信息,结果如下图所示:

       我们还通过model.save("mnist.h5")保存模型,后面我们会加载这个模型来进行预测。

prediction = model.predict(x_test[:1], batch_size=32)
print(x_test[:1])
print(y_test[:1])
print(prediction)
print(np.argmax(prediction, axis=1))

    我们简单通过测试集的第一个数字7来进行了一个验证,这个验证,主要是要知道我们将来传入图片需要什么类型的数据,以及得到预测结果之后,怎么取值。这里prediction是一个按照概率来进行组装的数组,哪个概率大,最终的结果就是谁。我们通过np.argmax(prediction, axis=1)指定获取一个数组中按行(axis=1)来统计最大的那个数。

***************************************************************

    预测

     很多代码示例里面,基本上到了model.evaluate()对算法进行评估之后,就没有了,对于刚入门的人来说,神经网络创建了,测试了,好不好用也不知道。因为这个训练集和测试机都是官网给出的例子,对于程序员来说,通过实践来验证一个猜测,那才是最重要的,至于这是什么不重要。

     上面的代码最后,我们通过测试集x_test[:1]也就是第一个测试数字简单做了一个预测,大概知道了要预测,需要的数据是一个[28*28=784]的数组。而我们准备的测试图片应该也要和官方给出的测试数据对应上,也即是前面提到的图片是28*28像素的数字图片,如下所示:

    同样的给出代码:

import keras
import numpy as np
import cv2
from keras.models import load_modelmodel = load_model("mnist.h5")def predict(img_path):img = cv2.imread(img_path, 0)img = img.reshape(28, 28).astype("float32") / 255  # 0 1img = img.reshape(-1, 784)  # 28 * 28 -> 784label = model.predict(img)label = np.argmax(label, axis=1)print('{} -> {}'.format(img_path, label[0]))if __name__ == '__main__':for _ in range(10):predict("number_images/b_{}.png".format(_))

    这些图片我们放在number_images目录下,命名规则是b_0.png,b_1.png这样子。

    最后,我们加载模型,并通过opencv库加载图片,并转换图片矩阵为784个元素的数组。然后交给模型预测,预测结果是一个概率数组,取概率最大的那个数组元素。

     预测结果如下:

    结果很感人,并没有达到很高的概率,准确率60%,而且这个概率对于手写图片识别来说,还有点偏高,因为实际上很多数字图片识别错误。 

    这篇文章,主要就keras构建简单神经网络,并进行训练,测试,最后还通过我们自己手写的数字图片来进行预测验证,也过了一把深度学习的瘾。

    本文keras和tensorflow版本是2.8.0,可能有几个api与其他地方有区别,比如datasets,这里使用的是tensorflow.keras.datasets。另外在计算成功率acc的时候,使用的是history['accuracy'],有的地方可能直接是history['acc'],应该是版本的问题,根据自己的版本找到合适的方法就行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619284.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

脑优化全集

1电脑优化全集 一、系统优化设置 1、删除Windows强加的附件: a.用记事本NOTEPAD修改sysoc.inf(在windiws/inf文件夹),用查找/替换功能,在查找框中输入,hide,7(一个英文逗号紧跟hide,一个英文逗…

个人永久性免费-Excel催化剂功能第49波-标准数据结构表转报表样式结果

中国的企业信息化,已经过去了20年,企业里也产生了大量的数据,IT技术的信息化管理辅助企业经营管理也已经得到广泛地认同,现在就连一个小卖部都可以有收银系统这样的信息化管理介入。但同时也有一个很现实的问题,不是所…

个人永久性免费-Excel催化剂功能第37波-把Sqlserver的强大分析函数拿到Excel中用...

本人一直钟情于使用Sqlserver数据库的一大原因是其提供了非常好用、高效的数据分析函数(窗口函数),可以在做数据清洗和数据分析场合等多个场景使用。只需简单的一个函数即可做出常规SQL语句很难以实现的效果。这么好用的函数,如今…

个人永久性免费-Excel催化剂功能第43波-文本处理类函数增强

Excel的函数有400多个,真正常用的50多个,而常有的文本处理类函数也不多,不是因为文本类处理简单,而是Excel真的有点挤牙膏式的每个版本更新那么几个小函数,普通用户等得急切,但实际上这些小函数&#xff0c…

个人永久性免费-Excel催化剂功能第30波-工作表快捷操作(批量创建、命名、排序、工作表目录)...

日常使用Excel过程中,最多的操作无外乎单元格和工作表的操作,单元格的操作在前面已经有详细的辅助功能提供,此篇提供工作表相关的操作。这两项的操作若能有提速,日常大量的工作叠加起来真是省下不少时间。 文章出处说明 原文在简书…

自定义镜像上传阿里云

目录 一、Docker制作jdk镜像 jdkv1.0版本 ① 编写Dockerfile文件 ② 执行Dockerfile文件,初次依赖镜像的时候会下载相应的镜像 ③ 查看镜像 ④ 创建并启动容器 二、alpine 制作jdk镜像 jdkv2.0的版本 1.alpine Linux 简介 2.基于 alpine 制作 j…

个人永久性免费-Excel催化剂功能第28波-工作薄瘦身,安全地减少非必要冗余

Excel催化剂在完善了数据分析场景的插件需求后,决定再补充一些日常绝大多数Excel用户同样可以使用到的小功能,欢迎小白入场,在不违背太多Excel最佳实践的前提下,Excel催化剂乐意为广大Excel用户们增添有价值和高频使用的快捷操作类…

计算机英语总结800,高三英语教师工作总结800字(通用5篇)

高三英语教师工作总结800字(通用5篇) 难忘的工作生活已经告一段落了,回顾这段时间的工作,相信你有很多感想吧,来为这一年的工作写一份工作总结吧。大家知道工作总结的格式吗?下面是小编精心整理的高三英语教师工作总结800字(通用5…

如何提高英语听力(内容摘自NECCS)+ 乘法表

乘法表 print(\n.join([ .join([%s*%s%-2s%(y,x,x*y) for y in range(1,x1)]) for x in range(1,10)])) 如何提高英语听力 很喜欢这篇关于提高英语听力的文章,所以收藏下来和大家一同分享一下 人走路时要用两条腿,没有任何人会觉得走路费劲。可如果让人…

张晓楠讲如何提高英语听力

张晓楠:现在是中央电视台财经频道(CCTV-2)的记者。曾任北京电视台青少频道主持人。原新浪网财经频道的主持人兼记者。毕业于美国哥伦比亚大学,主修金融方向,获公共管理硕士学位;曾在纽约摩根大通银行、瑞士信贷投资银行…

2023年6月GESP C++ 四级试卷解析

一、单选题(每题2分,共30分) 1.高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A.编辑 B.保存 C.调试 D.编译 【答案】D 【考纲知识点】编程环境(一级) 【解析】本题…

红警 1 游戏开源,代码非常规范,网友:秀色可餐

作者 | 程序员的那些事 来源 | 程序员的那些事(id:iProgrammer) 最后有一个小测试!测测你是不是红警老玩家! EA 部分开源红警啦! 5 月 27 日,知名游戏公司 EA 在 GitHub 上搞了个大新闻&#xf…

《网络安全等级保护基本要求》(GB/T 22239-2019)标准解读

关键词: 等级保护对象; 安全通用要求; 安全扩展要求 中图分类号:TP309 文献标志码:A 文章编号:1671-1122(2019)02-0077-08 Baseline for Classified Protection of Cybersecurity (GB/T 22239-2019) Standard Interpretation MA Li1, ZHU Guobang2, L…

es学习记录

Elasticsearch 是一个实时的分布式搜索分析引擎,它被用作全文检索、结构化搜索、分析以及这三个功能的组合,内部使用 Lucene 做索引与搜索。 1.es的实际应用 2.es全文检索简单介绍 基础概念带过一下 Index 可类比为DBMS的库 Type 可类比一张表 Docu…

uni-app里使用webscoket

实现思路和vue中是一样的。如果想看思路可以看这篇文章:websocket 直接上可以运行的代码: 一、后端nodeJS代码: 1、新建项目文件夹 2、初始化项目: npm init -y 3、项目里安装ws npm i ws --save 4、nodeJS代码&#xff1…

奥园地产惠州奥园誉博府提前交付 匠心品质备受认可

一直以来,奥园地产的交付工作都是备受关注的,一方面,是交付的时间非常准时,让业主充满期待;另一方面,是交付的品质一直有保障,让业主更加安心。此次奥园地产惠州奥园誉博府已经是第二次交付了&a…

首创置业“中国之家-和园”将在巴黎开工奠基

中新网1月15日电 不久的将来,巴黎国际大学城将迎来第41座由中国开发商打造的特色建筑。在日前的第二届“大师之路-中法音乐节”暨和园奠基仪式新闻发布会上,首创置业宣布“中国之家-和园”将在巴黎国际大学城开工奠基。 据悉,巴黎国际大学城已…

明喆冲刺深交所:拟募资14亿 高海清家族3年分红超7亿

雷递网 雷建平 6月28日 明喆集团股份有限公司(简称:“明喆集团”)日前递交招股书,准备在深交所主板上市。 明喆集团计划募资14亿元,其中,3.6亿元用于营销网络及品牌建设项目,3.08亿元用于信息化…

康鹏科技将于12月16日上会:曾在纽交所上市,由杨建华家族控股

近日,上海康鹏科技股份有限公司(下称“康鹏科技”)在上海证券交易所递交招股书(上会稿),准备在科创板上市。据贝多财经了解,康鹏科技将于2022年12月16日接受科创板上市委的现场审议。 根据公开信…

雅居乐陈卓林择址置业热土,耀启一城精彩

这个时代,城市的土地资源及生态人文属性,因不可再生而显得弥足珍贵。建筑可以复制,唯有资源难以再造,花溪正凭借其出色的宜居属性,成为贵阳理想的置业热土。在花溪区域发展的历程中,除最早入驻花溪的一批房…