Tensorflow - 加载卷积神经网络实现手写体数字识别
上一篇博客中,我们已经训练好了模型
https://blog.csdn.net/Polaris47/article/details/80718328
接下来我们要加载模型并识别真实场景下的一个手写体数字
在此之前,我们先要准备好一张28*28像素的图像(可用ps制作),然后通过处理将像素的强度值变为0-1之间,之后即可输入模型进行识别。
保存已训练的模型文件如下:
代码如下:
import tensorflow as tf
import matplotlib.pyplot as plt
from PIL import Imagedef imageprepare(imagepath):im = Image.open(imagepath) #读取的图片所在路径,注意是28*28像素plt.imshow(im) #显示需要识别的图片plt.show()im = im.convert('L')tv = list(im.getdata())tva = [(255-x)*1.0/255.0 for x in tv]return tvadef weight_variable(shape, name):initial = tf.truncated_normal(shape, stddev=0.1) # 生成一个截断的正态分布return tf.Variable(initial, name=name)# 初始化偏置
def bias_variable(shape, name):initial = tf.constant(0.1, shape=shape)return tf.Variable(initial, name=name)# 卷积层
def conv2d(x, W):# x input tensor of shape `[batch, in_height, in_width, in_channels]`# W filter / kernel tensor of shape [filter_height, filter_width, in_channels, out_channels]# `strides[0] = strides[3] = 1`. strides[1]代表x方向的步长,strides[2]代表y方向的步长# padding: A `string` from: `"SAME", "VALID"`return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')# 池化层
def max_pool_2x2(x):# ksize [1,x,y,1]return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')# 命名空间
with tf.name_scope('input'):# 定义两个placeholderx = tf.placeholder(tf.float32, [None, 784], name='x-input')y = tf.placeholder(tf.float32, [None, 10], name='y-input')with tf.name_scope('x_image'):# 改变x的格式转为4D的向量[batch, in_height, in_width, in_channels]`x_image = tf.reshape(x, [-1, 28, 28, 1], name='x_image')with tf.name_scope('Conv1'):# 初始化第一个卷积层的权值和偏置with tf.name_scope('W_conv1'):W_conv1 = weight_variable([5, 5, 1, 32], name='W_conv1') # 5*5的采样窗口,32个卷积核从1个平面抽取特征with tf.name_scope('b_conv1'):b_conv1 = bias_variable([32], name='b_conv1') # 每一个卷积核一个偏置值# 把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数with tf.name_scope('conv2d_1'):conv2d_1 = conv2d(x_image, W_conv1) + b_conv1with tf.name_scope('relu'):h_conv1 = tf.nn.relu(conv2d_1)with tf.name_scope('h_pool1'):h_pool1 = max_pool_2x2(h_conv1) # 进行max-poolingwith tf.name_scope('Conv2'):# 初始化第二个卷积层的权值和偏置with tf.name_scope('W_conv2'):W_conv2 = weight_variable([5, 5, 32, 64], name='W_conv2') # 5*5的采样窗口,64个卷积核从32个平面抽取特征with tf.name_scope('b_conv2'):b_conv2 = bias_variable([64], name='b_conv2') # 每一个卷积核一个偏置值# 把h_pool1和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数with tf.name_scope('conv2d_2'):conv2d_2 = conv2d(h_pool1, W_conv2) + b_conv2with tf.name_scope('relu'):h_conv2 = tf.nn.relu(conv2d_2)with tf.name_scope('h_pool2'):h_pool2 = max_pool_2x2(h_conv2) # 进行max-pooling# 28*28的图片第一次卷积后还是28*28,第一次池化后变为14*14
# 第二次卷积后为14*14,第二次池化后变为了7*7
# 进过上面操作后得到64张7*7的平面with tf.name_scope('fc1'):# 初始化第一个全连接层的权值with tf.name_scope('W_fc1'):W_fc1 = weight_variable([7 * 7 * 64, 1024], name='W_fc1') # 上一场有7*7*64个神经元,全连接层有1024个神经元with tf.name_scope('b_fc1'):b_fc1 = bias_variable([1024], name='b_fc1') # 1024个节点# 把池化层2的输出扁平化为1维with tf.name_scope('h_pool2_flat'):h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64], name='h_pool2_flat')# 求第一个全连接层的输出with tf.name_scope('wx_plus_b1'):wx_plus_b1 = tf.matmul(h_pool2_flat, W_fc1) + b_fc1with tf.name_scope('relu'):h_fc1 = tf.nn.relu(wx_plus_b1)# keep_prob用来表示神经元的输出概率with tf.name_scope('keep_prob'):keep_prob = tf.placeholder(tf.float32, name='keep_prob')with tf.name_scope('h_fc1_drop'):h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob, name='h_fc1_drop')with tf.name_scope('fc2'):# 初始化第二个全连接层with tf.name_scope('W_fc2'):W_fc2 = weight_variable([1024, 10], name='W_fc2')with tf.name_scope('b_fc2'):b_fc2 = bias_variable([10], name='b_fc2')with tf.name_scope('wx_plus_b2'):wx_plus_b2 = tf.matmul(h_fc1_drop, W_fc2) + b_fc2with tf.name_scope('softmax'):# 计算输出prediction = tf.nn.softmax(wx_plus_b2)res = tf.argmax(prediction, 1)saver = tf.train.Saver()
image = imageprepare('6.png')with tf.Session() as sess:saver.restore(sess, "cnn_Model/model.ckpt")result = sess.run(res,feed_dict={x: [image],keep_prob:1.0})print('识别结果为:%d' %result)
制作的图像和识别结果如下:
Tensorflow - 加载卷积神经网络实现手写体数字识别相关推荐
- 基于AlexNet卷积神经网络的手写体数字识别系统研究-附Matlab代码
⭕⭕ 目 录 ⭕⭕ ✳️ 一.引言 ✳️ 二.手写体数字识别系统 ✳️ 2.1 MNIST 数据集 ✳️ 2.2 CNN ✳️ 2.3 网络训练 ✳️ 三.手写体数字识别结果 ✳️ 四.参考文献 ✳️ ...
- 基于TensorFlow卷积神经网络的手写体数字识别
一.卷积神经网络(CNN) 二.LeNet 三.代码 1.Mnist手写体训练并测试 2.可视化 四.数据集分析 五.结果分析 1.准确率 2.可视化测试 一.卷积神经网络(CNN) 参考:https ...
- 基于AlexNet卷积神经网络的手写体数字倾斜校正系统研究-附Matlab代码
⭕⭕ 目 录 ⭕⭕ ✳️ 一.引言 ✳️ 二.AlexNet 网络 ✳️ 三.实验验证 ✳️ 3.1 实验数据集 ✳️ 3.2 数据训练 ✳️ 3.3 手写体倾斜数字校正结果 ✳️ 四.参考文献 ✳️ ...
- 特征匹配实现印刷体数字识别,卷积神经网络实现印刷体数字识别
特征匹配实现印刷体数字识别,卷积神经网络实现印刷体数字识别(很可靠) 1.印刷体数字识别(特征匹配) 1.首先需要了解为什么印刷体数字识别我使用的是特征匹配的方法,我起初也走了很多的坑,当初固执的识别 ...
- 并行化实现基于BP神经网络的手写体数字识别
并行化实现基于BP神经网络的手写体数字识别 手写体数字识别可以堪称是神经网络学习的"Hello World" ,我今天要说的是如何实现BP神经网络算法的并行化,我们仍然是以手写体数 ...
- matlab+BP神经网络实现手写体数字识别
个人博客文章链接:http://www.huqj.top/article?id=168 接着上一篇所说的 BP神经网络,现在用它来实现一个手写体数字的识别程序,训练素材来自吴恩达机器学习课程,我把打包 ...
- 基于BP神经网络的手写体数字识别matlab仿真实现
目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 文字.数字识别是一个典型的模式识别问题,也是模式识别中一个非常重要的应用领域.在文字.数字识别系统中,手写体的文字与识别是一个较难的领域, ...
- 利用python卷积神经网络手写数字识别_卷积神经网络使用Python的手写数字识别
为了使机器更智能,开发人员正在研究机器学习和深度学习技术.人类通过反复练习和重复执行任务来学习执行任务,从而记住了如何执行任务.然后,他大脑中的神经元会自动触发,它们可以快速执行所学的任务.深度学习与 ...
- 卷积神经网络 手写数字识别(包含Pytorch实现代码)
Hello!欢迎来到六个核桃Lu! 运用卷积神经网络 实现手写数字识别 1 算法分析及设计 卷积神经网络: 图1-2 如图1-2,卷积神经网络由若干个方块盒子构成,盒子从左到右仿佛越来越小,但却越来越 ...
最新文章
- 高校青椒为避免相亲重复,给没谈成的124个姑娘每人建了个文件夹...
- 2分钟在线做出一张普氏分析图(Procrustes Analysis)
- Java堆和栈的一些区别。。。
- OPENCV标定外参
- Seata RPC 模块的重构之路
- android Spinner点击事件处理
- QT的QSGMaterialShader类的使用
- java arraylist排序_一文读懂Java集合框架
- 用html页面制作开关,利用前端基础制作html开关图标
- java输出到txt,换行问题
- 【C++】 C++入门和基础
- 似然函数(likehood)和概率分布(probability)
- u盘引导linux加载raid卡驱动,解决方案:如何使用centos U盘加载Raid卡驱动程序_计算机基础知识_IT /计算机_资源...
- APP隐私合规检测工具Camille环境搭建
- 如何挑选机械键盘?高性价比的机械键盘推荐
- java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted 的解决方案
- 博物馆沉浸式体验如何彰显文化价值
- 国内首部创业纪实电影《燃点》进校园:如何靠近成功的2%
- 动态规划C++实现--换钱的方法数(二)(动态规划及其改进方法)
- 做PPT别再傻乎乎的直接插入图片了,手把手教你处理毛玻璃式图片