使用已经得到的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 相关文章推荐
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
python黑魔法之参数传递
Feb 12 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
python使用Apriori算法进行关联性解析
Dec 21 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
python使用生成器实现可迭代对象
Mar 20 Python
python实现最长公共子序列
May 22 Python
利用Python如何实现一个小说网站雏形
Nov 23 Python
Python使用pyserial进行串口通信的实例
Jul 02 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
Django配置跨域并开发测试接口
Nov 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
php IP及IP段进行访问限制的代码
2008/12/17 PHP
PHP日期时间函数的高级应用技巧
2009/05/16 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
python框架django基础指南
2016/09/08 Python
python flask实现分页效果
2017/06/27 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
Python字符串三种格式化输出
2020/09/17 Python
python数据抓取3种方法总结
2021/02/07 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
幼师自荐信范文
2013/10/06 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
大学生社会实践评语
2014/04/25 职场文书
创建青年文明号材料
2014/05/09 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
党支部鉴定意见
2015/06/02 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android