使用已经得到的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通过加号运算符操作列表的方法
Jul 28 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
使用python3.5仿微软记事本notepad
Jun 15 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
对Python3中的input函数详解
Apr 22 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
python基于opencv检测程序运行效率
Dec 28 Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
Python中对象的比较操作==和is区别详析
Feb 12 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
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
详解Python中的文本处理
2015/04/11 Python
python中字符串内置函数的用法总结
2018/09/13 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
python对于requests的封装方法详解
2019/01/03 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
销售工作人员的自我评价分享
2013/11/10 职场文书
应用数学自荐书范文
2013/11/24 职场文书
清洁工岗位职责
2014/01/29 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
2014年车间工作总结
2014/11/21 职场文书
个人优缺点总结
2015/02/28 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
2016公司年会主持词
2015/07/01 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记