使用已经得到的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 实现归并排序算法
Jun 05 Python
linux系统使用python监测系统负载脚本分享
Jan 15 Python
Python中optionParser模块的使用方法实例教程
Aug 29 Python
python构建深度神经网络(DNN)
Mar 10 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
Python配置文件处理的方法教程
Aug 29 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Python批量处理csv并保存过程解析
May 16 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
用python计算文件的MD5值
Dec 23 Python
深入浅析Django MTV模式
Sep 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
PHPEXCEL 使用小记
2013/01/06 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
Python实现的石头剪子布代码分享
2014/08/22 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
python标准库OS模块详解
2020/03/10 Python
主管职责范文
2013/11/09 职场文书
法制教育演讲稿
2014/09/10 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
项目负责人岗位职责
2015/02/15 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python
DE1103使用报告
2022/04/05 无线电