使用已经得到的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与js)两种实现
Feb 21 Python
matplotlib中legend位置调整解析
Dec 19 Python
Django中Model的使用方法教程
Mar 07 Python
Python按钮的响应事件详解
Mar 04 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
Python目录和文件处理总结详解
Sep 02 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
pytorch实现线性拟合方式
Jan 15 Python
推荐8款常用的Python GUI图形界面开发框架
Feb 23 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
Pandas自定义选项option设置
Jul 25 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
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
python基础之入门必看操作
2017/07/26 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
对Python中内置异常层次结构详解
2018/10/18 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
毕业研究生的自我鉴定
2013/11/30 职场文书
节能减排倡议书
2014/04/15 职场文书
自主招生教师推荐信
2014/05/10 职场文书
美术学专业求职信
2014/07/23 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2015年团支书工作总结
2015/04/03 职场文书
借条格式范本
2015/05/25 职场文书
建国大业观后感
2015/06/01 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
六年级作文之关于梦
2019/10/22 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL
Redis批量生成数据的实现
2022/06/05 Redis