使用已经得到的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类型强制转换long to int的代码
Feb 10 Python
Python中字典的基本知识初步介绍
May 21 Python
Python使用剪切板的方法
Jun 06 Python
Python语言实现将图片转化为html页面
Dec 06 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
Python实现的文轩网爬虫完整示例
May 16 Python
python实现身份证实名认证的方法实例
Nov 08 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
python raise的基本使用
Sep 10 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
解决numpy数组互换两行及赋值的问题
Apr 17 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 超链接 抓取实现代码
2009/06/29 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
农历与西历对照
2006/09/06 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
大学生求职自荐信
2013/12/12 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android