使用已经得到的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实现TCP服务器端与客户端的方法详解
Apr 30 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
基于Python对数据shape的常见操作详解
Dec 25 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
Python FFT合成波形的实例
Dec 04 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
Python与C/C++的相互调用案例
Mar 04 Python
总结python多进程multiprocessing的相关知识
Jun 29 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
php class类的用法详细总结
2013/10/17 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
一些不错的js函数ajax
2008/08/20 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python实现的检测网站挂马程序
2014/11/30 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Python创建xml文件示例
2017/03/22 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python读取xlsx的方法
2018/12/25 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
python 弧度与角度互转实例
2020/04/15 Python
python和php哪个更适合写爬虫
2020/06/22 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
英国最大的海报商店:GB Posters
2018/03/20 全球购物
细节决定成败演讲稿
2014/05/12 职场文书
商场父亲节活动方案
2014/08/27 职场文书
Java 数据结构七大排序使用分析
2022/04/02 Java/Android