python识别简单训练模型_使用已经得到的keras模型识别自己手写的数字方式

环境: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使用的是黑底白字的图片,所以你自己手写数字的时候一定要注意把得到的图片也改成黑底白字的,否则会识别错(至少我得到的结论是这样的 ,之前用白底黑字的图总是识别出错)

源码一览:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import cv2

import numpy as np

from keras.modelsimport 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)

效果图:

1-2006301010025a.jpg

补充知识:keras编写自定义的层

写在前面的话

keras已经有很多封装好的库供我们调用,但是有些时候我们需要的操作keras并没有,这时就需要学会自定义keras层了

1.Lambda

这个东西很方便,但是只能完成简单、无状态的自定义操作,而不能建立含有可训练权重的自定义层。

1

2

3

4

5

6

7

8

9

from keras.layersimport Input,Lambda

from kerasimport 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中文文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

2.自定义keras层(带有可训练权重)

① build:定义权重,且self.build=True,可以通过迪奥哟经super([layer],self).build()完成

② call:功能逻辑实现

③ compute_output_shape:计算输出张量的shape

import keras.backend as K

from keras.engine.topologyimport 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模型识别自己手写的数字方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/baidu_35113561/article/details/79371716

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive 导出json格式 文件_hive存储json格式文件

hive从0.12版本以后就开始自身支持json文件的格式了1.文件格式下面是测试用的文件预览格式,我将其存储为jsonTest.json文件,放在了/root目录下{"_location":"(32.121, 45.262)","_ip":"2.12.1.211","_action":"click b…

HDU 4033 Regular Polygon(二分+高精度)

比赛时没做出来,最后10 钟时倒是想枚举每个角度,精度估计上可能会出问题; 后来听“理宝”说可以暴力枚举边的长度,精确到0.001,数据恰好10^7,T_T~~ vongang说可以用二分做,也就是官方解题报告的…

[html] html5点击返回键怎样不让它返回上一页?

[html] html5点击返回键怎样不让它返回上一页? $(function() {if (window.history && window.history.pushState) {$(window).on(popstate, function () {window.history.pushState(forward, null, #);window.history.forward(1);});}window.history.pushSt…

python怎么输出结果_Python中print()常用输出方法

print函数用法 1.输出字符串 print Hello World print "Hello World" print (Hello World) print ("Hello World") [注] 对于Python 3.0及以上版本,print是函数,因此需要编写print ()而不是print。 输出结果: Hello Worl…

Redis的备份与恢复

备份 dump.rdb:RDB方式的备份文件 appendonly.aof:AOF方式的备份文件rdb 备份处理 # 编辑redis.conf文件,找到如下参数,默认开启。 save 900 1 save 300 10 save 60 10000aop备份处理 # 编辑redis.conf文件,找到如下参…

javascript网页自动填表_JavaScript脚本实现网页批量自动勾选及内容填写

我们知道,大部分学校每个学期都有教学评估。对于我这种习惯性好评,老师又真心不错的人,十多个老师的评价都是good,这是赤裸裸的重复劳动啊。于是我动了歪念头...嘿嘿嘿1.登录教学评估的网页,选择一位老师:如…

java 修改 jar 包文件内容的一个实例

开发这个小工具的初衷是为了修改工具 jar 包中的配置文件 本来打算将这个功能集成到 工具 jar 包自身 但是这里貌似有点儿问题,因为该 jar 包文件当前正在被 java 虚拟机使用,所以无法对其进行修改操作~ 这里我有点儿疑惑,难道不是将 jar 包整…

python画图灰白_python 站点资料插值画图及白化

import cmaps import maskout import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import Rbf from mpl_toolkits.basemap import Basemap plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文 plt.rcParams[axes.unicode_…

[html] 在普通网页中如何调用html5+的plus对象?

[html] 在普通网页中如何调用html5的plus对象? document.addEventListener( "plusready", onPlusReady, false ); onPlusReady 函数中就可以引用plus对象个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定…

算法之归并排序

package com.ebiz.sort;import java.util.Arrays;/*** author YHj* create 2019-09-03 22:21* /*** 归并排序(递归)** ①. 将序列每相邻两个数字进行归并操作,形成 floor(n/2)个序列* ②. 执行①直到每组有一个元素 * ③. 各组之间进行比较*…

eureka需要替换吗_nacos无缝替换eureka

首先安装好nacos之后直接引入客户端依赖和配置文件,同时把eureka的内容去掉从nacos官网 https://nacos.io/zh-cn/index.html 下载安装包下载好之后解压,打开配置文件 conf/application.properties 配置一下mysql和地址,其他的的按需配置serve…

程旭元系统漫画第三期:加班 !

对于苦逼的程旭元来说 加班已经变成了生活中不可缺少的部分 他的原则是不能像胖子那样贪吃 不能像销售员那样狡诈 一定要尽忠职守 精忠报国 !老板说什么他就做什么! 对于一个从来只说加班不加工资的boss来说 唯命是从就是存活在公司的最好方式~ 但是有…

python 的库如何开发_一篇文章入门Python生态系统

译者按:原文写于2011年末,虽然文中关于Python 3的一些说法可以说已经不成立了,但是作为一篇面向从其他语言转型到Python的程序员来说,本文对Python的生态系统还是做了较为全面的介绍。文中提到了一些第三方库,但是Pyth…

[html] 你知道什么是html5plus吗?

[html] 你知道什么是html5plus吗? 用js的方式来调用移动app(安卓和ios)的原生能力,例如拍照,摄像个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一…

机器学习线性回归案例讲解_09机器学习实战之简单线性回归

基本概念1. 介绍:回归(regression) Y变量为连续数值型(continuous numerical variable)如:房价,人数,降雨量分类(Classification): Y变量为类别型(categorical variable)如:颜色类别,电脑品牌,有…

silverlight Image Source URI : 一个反斜杠引发的血案

silverlight Image Source URI : 一个反斜杠引发的血案 Silverlight2 现在支持的Image格式有jpg和png&#xff0c;部分png编码也不支持&#xff0c;同时有些png在xaml的design预览中不可见&#xff0c;但运行时可见。请看XAML markup中两行代码的异同&#xff1a; <StackPan…

python编码和解码_Python中的编码与解码(转)

Python中的字符编码与解码困扰了我很久了&#xff0c;一直没有认真整理过&#xff0c;这次下静下心来整理了一下我对方面知识的理解。 文章中对有些知识没有做深入的探讨&#xff0c;一是我自己也没有去深入的了解&#xff0c;例如各种编码方案的实现方式等&#xff1b;二是我觉…

[html] 怎样使用iframe刷新父级页面

[html] 怎样使用iframe刷新父级页面 //在父页面中window.addEventListener("message",function(e){if(e.data.reload){winodw.location.reload()}}, false);//在子页面中window.parent.postMessage({reload:true})个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前…

Nginx编译安装和平滑升级

一、Nginx的编译安装 1、安装依赖包gcc&#xff0c;gcc-c&#xff0c;pcre&#xff0c;openssl-devel 命令&#xff1a;yum -y install gcc gcc-c pcre-devel openssl-devel 2、下载Nginx源码包 Nginx下载地址&#xff1a;http://nginx.org/download/nginx-1.12.2.tar.gz …

python 调用shell 不阻塞_遇到问题---python调用shell脚本时subprocess.check_call不阻塞

遇到的问题使用命令subprocess.check_call(cmd, shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT)在ubuntu系统中python中使用subprocess.check_call调用shell命令。发现subprocess.check_call的阻塞无效&#xff0c;导致下面的命令缺失信息。但是同样的代码在cent…