使用已经得到的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 11 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
Python中extend和append的区别讲解
Jan 24 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
24式加速你的Python(小结)
Jun 13 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
Python执行时间的几种计算方法
Jul 31 Python
python 利用opencv实现图像网络传输
Nov 12 Python
Python图片处理之图片裁剪教程
May 27 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
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
JS上传前预览图片实例
2013/03/25 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
javascript中Object使用详解
2015/01/26 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
python: 自动安装缺失库文件的方法
2018/10/22 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
Django实现简单的分页功能
2021/02/22 Python
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
银行实习鉴定
2013/12/13 职场文书
中学教师请假制度
2014/02/03 职场文书
客服部工作职责范本
2014/02/14 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
二审代理词范文
2015/05/25 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python