使用已经得到的keras模型识别自己手写的数字方式
作者:游学者冬夜 发布时间:2021-04-03 17:41:11
环境: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层了
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)]
来源:https://blog.csdn.net/baidu_35113561/article/details/79371716


猜你喜欢
- 在工作中遇到把DataGrid中绑定的后台数据库数据展示给用户时把负数变为0的小问题,现在记录下来。例子中数据表示这个样子的:-------
- 1. Python模块和包:一切从基础开始Python模块是一个Python文件,包含一些相关的函数、类或变量的定义,可以通过 i
- 转眼间上次写文章已经是 2022年12月15日的事情啦,本来从2022年7月份开始写作之后保持着每周一篇,然而从12月15日后断更了这么久,
- 一个什么都不懂的家伙非跟我要个sql查询器 随便写了一个,当然为了数据安全,要过滤掉一个sql关键词和系统中的一些表了 哦,对了,里面的一些
- Microsoft SQL server2000由一系列相互协作的组件构成。能满足最大的WEB站点和企业数据处理系统存储
- QPS原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。公式:( 总PV数 * 80% ) / ( 每天秒数 * 20%
- 在raft中,选取成功后集群就可以正常工作,一次正常的客户端提案过程如下:客户端连接到leader,发起提案leader收到提案后将提案,包
- 初学初用,随手记录以当作笔记使用,会慢慢再进行补充添加,错误之处烦请指正。(1)运行本地文件,在代码不加载的情况下可以直接显示结果% run
- Python pip安装lxml出错的问题解决办法1. 在使用pip安装lxml过程中出现了一下错误: &
- 编程是数据科学中不可或缺的技能,虽然创建脚本来执行基本功能很容易,但编写大规模可读性良好的代码需要更多的思考。关于PEP-8pycodest
- 在学习Python正则式的过程中,有一个问题一直困扰我,如何去匹配一个反斜杠(即“\”)?一、引入在学习了Python特殊字符和原始字符串之
- Python:type、object、classPython: 一切为对象>>> a = 1>>> ty
- 这篇文章主要介绍了Python如何使用argparse模块处理命令行参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 一、get//get请求function getUrl($url, $header = []){ $ch = cu
- session的超时时间设置settings中SESSION_COOKIE_AGE=60*30 30分钟。SESSION_EXPIRE_AT
- 在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了。在那时没有ODP.NE
- 1、公式推导 对幂律分布公式:对公式两边同时取以10为底的对数:所以对于幂律公式,对X,Y取对数后,在坐标轴上为线性方程。2、可视化 从图形
- Embedding的近邻搜索是当前图推荐系统非常重要的一种召回方式,通过item2vec、矩阵分解、双塔DNN等方式都能够产出训练好的use
- 记录训练过程history=model.fit(X_train, Y_train, epochs=epochs,batch_size=bat
- 本文实例讲述了Python实现将照片变成卡通图片的方法。分享给大家供大家参考,具体如下:之前的文章介绍了使用Photoshop将照片变成卡通