使用已经得到的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分析git log日志示例
Feb 27 Python
Python功能键的读取方法
May 28 Python
深入浅析python中的多进程、多线程、协程
Jun 22 Python
python下载微信公众号相关文章
Feb 26 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
使用Pytorch来拟合函数方式
Jan 14 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
Matplotlib配色之Colormap详解
Jan 05 Python
python获取对象信息的实例详解
Jul 07 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
python实现维吉尼亚算法
2019/03/20 Python
解析python实现Lasso回归
2019/09/11 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
全球性的在线购物网站:Zapals
2017/03/22 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
劳资专员岗位职责
2013/12/27 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
2014年国庆节寄语
2014/09/19 职场文书
玄武湖导游词
2015/02/05 职场文书
2015年团支部工作总结
2015/04/03 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
通讯稿范文
2015/07/22 职场文书