使用已经得到的keras模型识别自己手写的数字方式


Posted in Python onJune 29, 2020

环境:Python+keras,后端为Tensorflow

训练集:MNIST

对于如何训练一个识别手写数字的神经网络,网上资源十分丰富,并且能达到相当高的精度。但是很少有人涉及到如何将图片输入到网络中并让已经训练好的模型惊醒识别,下面来说说实现方法及注意事项。

首先import相关库,这里就不说了。

然后需要将训练好的模型导入,可通过该语句实现:

model = load_model('cnn_model_2.h5') (cnn_model_2.h5替换为你的模型名)

之后是导入图片,需要的格式为28*28。可用opencv导入:

img = cv2.imread('temp3.png', 0) (temp3.png替换为你手写的图片)

然后reshape一下以符合模型的输入要求:

img = (img.reshape(1,1,28,28)).astype("float32")/255

之后就可以用模型识别了:

predict = model.predict_classes(img)

最后print一下predict即可。

下面划重点:因为MNIST使用的是黑底白字的图片,所以你自己手写数字的时候一定要注意把得到的图片也改成黑底白字的,否则会识别错(至少我得到的结论是这样的 ,之前用白底黑字的图总是识别出错)

源码一览:

import cv2
import numpy as np
from keras.models import load_model
model = load_model('cnn_model_2.h5')

image = cv2.imread('temp3.png', 0)
img = cv2.imread('temp3.png', 0)

img = (img.reshape(1,1,28,28)).astype("float32")/255
predict = model.predict_classes(img)
print ('识别为:')
print (predict)

cv2.imshow("Image1", image)
cv2.waitKey(0)

效果图:

使用已经得到的keras模型识别自己手写的数字方式

补充知识:keras编写自定义的层

写在前面的话

keras已经有很多封装好的库供我们调用,但是有些时候我们需要的操作keras并没有,这时就需要学会自定义keras层了

1.Lambda

这个东西很方便,但是只能完成简单、无状态的自定义操作,而不能建立含有可训练权重的自定义层。

from keras.layers import Input,Lambda
from keras import Model
import tensorflow as tf

input=Input(shape=(224,224,3))
input.shape #Input第一个维度为batchsize维度
output=Lambda(lambda x: x[...,1])(input) #取最后一个维度的数据,...表示前面所有的维度
Model=Model(inputs=input,outputs=output)
Model.output

2.keras_custom

学习自keras中文文档

2.自定义keras层(带有可训练权重)
① build:定义权重,且self.build=True,可以通过迪奥哟经super([layer],self).build()完成
② call:功能逻辑实现
③ compute_output_shape:计算输出张量的shape

import keras.backend as K
from keras.engine.topology import Layer #这里的Layer是一个父类,下面的MyLayer将会继承Layer 

class MyLayer(Layer): #自定义一个keras层类
 def __init__(self,output_dim,**kwargs): #初始化方法
  self.output_dim=output_dim
  super(MyLayer,self).__init__(**kwargs) #必须要的初始化自定义层
 def build(self,input_shape): #为Mylayer建立一个可训练的权重
  #通过add_weight的形式来为Mylayer创建权重矩阵
  self.kernel=self.add_weight(name='kernel',
         shape=(input_shape[1],self.output_dim), #这里就是建立一个shape大小的权重矩阵
         initializer='uniform',
         trainable=True)
  super(MyLayer,self).build(input_shape) #一定要用,也可以用下面一行
  #self.build=True
 def call(self,x): #call函数里就是定义了对x张量的计算图,且x只是一个形式,所以不能被事先定义
  return K.dot(x,self.kernel) #矩阵乘法
 def compute_output_shape(self,input_shape):
  return (input_shape[0],self.output_dim) #这里是自己手动计算出来的output_shape
--------------------------------------------------------------------------------
class Mylayer(Layer):
 def __init__(self,output_dim,**kwargs):
  self.output_dim=output_dim
  super(MyLayer,self).__init__(**kwargs)
 def build(self,input_shape):
  assert isinstance(input_shape,list) #判断input_shape是否是list类型的
  self.kernel=self.add_weight(name='kernel',
         shape=(input_shape[0][1],self.output_dim), #input_shape应该长得像[(2,2),(3,3)]
         initializer='uniform',
         trainable=True)
  super(MyLayer,self).build(input_shape)
 def call(self,x):
  assert isinstance(x,list)
  a,b=x #从这里可以看出x应该是一个类似[(2,2),(3,3)]的list,a=(2,2),b=(3,3)
  return [K.dot(a,self.kernel)+b,K.mean(b,axis=-1)]

以上这篇使用已经得到的keras模型识别自己手写的数字方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写xml文件的操作实例
Oct 05 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
python制作websocket服务器实例分享
Nov 20 Python
python3中bytes和string之间的互相转换
Feb 09 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
python pytest进阶之conftest.py详解
Jun 27 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
python接入支付宝的实例操作
Jul 20 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 Python
Python接口测试环境搭建过程详解
Jun 29 #Python
python字典的值可以修改吗
Jun 29 #Python
python怎么自定义捕获错误
Jun 29 #Python
python打开文件的方式有哪些
Jun 29 #Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 #Python
python中如何写类
Jun 29 #Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 #Python
You might like
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
10条PHP编程习惯助你找工作
2008/09/29 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
jQuery语法总结和注意事项小结
2012/11/11 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
完美解决js传递参数中加号和&号自动改变的方法
2016/10/11 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
python实现调用其他python脚本的方法
2014/10/05 Python
Python循环语句中else的用法总结
2016/09/11 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
从python读取sql的实例方法
2020/07/21 Python
结婚周年感言
2014/02/24 职场文书
临床医学专业求职信
2014/08/08 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
500字小学生检讨书
2015/02/19 职场文书
会计试用期自我评价
2015/03/10 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL