首页 > 其他分享 >手写体识别Tensorflow实现

手写体识别Tensorflow实现

时间:2024-11-16 21:47:03浏览次数:3  
标签:compat index test batch tf train 手写体 Tensorflow 识别

在这里插入图片描述

简介:本文先讲解了手写体识别中涉及到的知识,然后分步讲解了代码的详细思路,完成了手写体识别案例的讲解,希望能给大家带来帮助,也希望大家多多关注我。本文是基于TensorFlow1.14.0的环境下运行的

手写体识别Tensorflow实现

1 MNIST数据集处理

数据集的网址如下:https://yann.lecun.com/exdb/mnist/
在这里插入图片描述他的数据集有训练集 测试集图片与标签四部分组成
被分为两部分 6万行训练数据集和1万行的测试数据集

在这里插入图片描述
每一张图片包含2828个像素,把他展开成一维向量,长度是284284 = 784,所以训练集是shape为[60000,784]的张量,第一个维度数字用来索引图片,第二个维度数字用来索引图片中的像素点
他的标签是介于0-9的数字,我们要把它转化为one - hot,也叫做独热 ,比如3 转化为 [0,0,1,0,0,0,0,0,0],他是几就让第几个数字为1.。所以labels将会被转化为一个shape为[60000,10]的矩阵

2 神经网络

根据第一节的内容我们可以设计一个简单的神经网络实现手写体识别,如果想提升准确率,可以在中间加入隐藏层。
在这里插入图片描述

3 Softmax函数

就用手写体识别这个举例子,比如说预测了某张图片的shape为[1,10]的可能是[15,3,1,0,2,4,5,1,1,0],我们希望将他转化为概率,且需要所有概率和为1,我们来看softmax的数学公式

在这里插入图片描述
这个zi就是对应[1,10]矩阵中的权重,zj这个分母部分是所有的和
这样子计算既满足了归一化的需求

3.1 什么时候用softmax

一般是用在神经网络的输出层,用于分类或者回归

3.2 softmax的优越性

  • 满足了人们对归一化的需求
  • 指数函数容易求偏导
  • 指数函数咋信息论和统计学中常用,可以联系这些,为神经网络的构建提供数学依据

4 代码实现分步讲解

4.1 导包

因为环境和版本等种种原因,他经常会报一些无关痛痒的小警告,所以我们要把这些警告屏蔽掉,然后导入TensorFlow等包

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

4.2 载入数据

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train)
print(y_train)

在这里插入图片描述

4.3 批次batch

这些图片不会一次性处理运算量太大了,比如设置为100,每次都会处理100张图片

batch_size = 100

还需要计算一共有多少个批次

n_batch = len(x_train) // batch_size
print(n_batch)

在这里插入图片描述

4.4 placeholder的定义

x = tf.compat.v1.placeholder(tf.float32,[None,784])
y = tf.compat.v1.placeholder(tf.float32,[None,10])

4.5神经网路模型的构建

Weight = tf.compat.v1.Variable(tf.zeros([784,10]))
bias = tf.compat.v1.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,Weight)+bias)

4.6 损失函数

loss = tf.reduce_mean(tf.square(y-prediction))

4.7使用梯度下降

如果您不会用,请阅读我的文章: 线性回归,在该文章中讲解了该函数的具体用法

train_step = tf.compat.v1.train.GradientDescentOptimizer(0.2).minimize(loss)

4.8 初始化 variable

init_option = tf.compat.v1.global_variables_initializer()

4.9 预测结果

4.9.1 tf.equal函数

他的作用是判断预测和真实是否一致

4.9.2 tf.argmax函数

因为我们计算的是某张图是那个数字的概率,所以需要把最大的拿出来当做是这个图的预测结果

最后我们的道德结果是一个由False和True组成的列表

correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))

4.10计算准确率

4.10.1 tf.cast数据类型转换

我们需要先把布尔类型的结果转化为浮点类型 1…0和0

4.10.2 tf.reduce_mean

他的作用是计算张量的平均值

accuracy_rate = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

4.13 对输入进行处理

# 将输入数据重塑为二维形式(原本图像数据是二维的,这里要展平为一维向量作为神经网络输入)
# 例如原来是 (60000, 28, 28) 变成 (60000, 784),60000是样本数量,784是28*28(图像像素数量)
x_train = x_train.reshape(x_train.shape[0], -1)
x_test = x_test.reshape(x_test.shape[0], -1)

4.12 使用Session进行训练

with tf.compat.v1.Session() as calculate:
    calculate.run(init_option)
    
    y_train = calculate.run(tf.one_hot(y_train, depth=10))
    # 将测试集标签进行独热编码,显式指定会话参数
    y_test = calculate.run(tf.one_hot(y_test, depth=10))

    for epoch in range(21):
        for batch in range(n_batch):
            # 计算当前batch的起始索引和结束索引
            start_index = batch * batch_size
            end_index = start_index + batch_size
            # 从训练数据集中提取当前batch的输入数据和标签数据
            batch_x = x_train[start_index:end_index]
            batch_y = y_train[start_index:end_index]
            # 将当前batch的数据喂入计算图进行训练
            calculate.run(train_step, feed_dict={x: batch_x, y: batch_y})
        # 在每个epoch结束后,在测试集上计算并打印当前的准确率
        acc = calculate.run(accuracy_rate, feed_dict={x: x_test, y: y_test})
        print("Epoch {}: Accuracy {}".format(epoch + 1, acc))

在这里插入图片描述

4.13代码汇总

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train)
print(y_train)
batch_size = 100
n_batch = len(x_train) // batch_size
print(n_batch)
x = tf.compat.v1.placeholder(tf.float32,[None,784])
y = tf.compat.v1.placeholder(tf.float32,[None,10])
Weight = tf.compat.v1.Variable(tf.zeros([784,10]))
bias = tf.compat.v1.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,Weight)+bias)
loss = tf.reduce_mean(tf.square(y-prediction))
train_step = tf.compat.v1.train.GradientDescentOptimizer(0.2).minimize(loss)
init_option = tf.compat.v1.global_variables_initializer()
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
accuracy_rate = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
# 将输入数据重塑为二维形式(原本图像数据是二维的,这里要展平为一维向量作为神经网络输入)
# 例如原来是 (60000, 28, 28) 变成 (60000, 784),60000是样本数量,784是28*28(图像像素数量)
x_train = x_train.reshape(x_train.shape[0], -1)
x_test = x_test.reshape(x_test.shape[0], -1)
with tf.compat.v1.Session() as calculate:
    calculate.run(init_option)
    
    y_train = calculate.run(tf.one_hot(y_train, depth=10))
    # 将测试集标签进行独热编码,显式指定会话参数
    y_test = calculate.run(tf.one_hot(y_test, depth=10))

    for epoch in range(21):
        for batch in range(n_batch):
            # 计算当前batch的起始索引和结束索引
            start_index = batch * batch_size
            end_index = start_index + batch_size
            # 从训练数据集中提取当前batch的输入数据和标签数据
            batch_x = x_train[start_index:end_index]
            batch_y = y_train[start_index:end_index]
            # 将当前batch的数据喂入计算图进行训练
            calculate.run(train_step, feed_dict={x: batch_x, y: batch_y})
        # 在每个epoch结束后,在测试集上计算并打印当前的准确率
        acc = calculate.run(accuracy_rate, feed_dict={x: x_test, y: y_test})
        print("Epoch {}: Accuracy {}".format(epoch + 1, acc))

致谢

本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对 Tensorflow在手写体识别的使用有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
Softmax函数

标签:compat,index,test,batch,tf,train,手写体,Tensorflow,识别
From: https://blog.csdn.net/qq_54414907/article/details/143822102

相关文章

  • (12-3-01)使用YOLOv8识别检测交通标志:基于YOLOv8的交通标志检测模型(1)使用自定义交通标志
    1.5 基于YOLOv8的交通标志检测模型本节的内容主要介绍了基于YOLOv8的交通标志检测模型的构建与训练过程。首先,使用YOLOv8的预训练模型,并通过定制的数据集对其进行了训练,以检测交通标志。在训练过程中,评估了不同的参数和优化器的影响,通过调整批量大小、学习率等参数来优化模......
  • 使用 Tcl 实现滑动验证码识别
    滑动验证码是一种常见的验证方式,用于验证用户操作的真实性。以下是使用Tcl实现滑动验证码识别的简单示例。功能概述程序的主要功能包括:读取滑动验证码的图片。分析滑块与缺口位置。模拟滑块移动,完成验证。代码实现tcl引入必要的库packagerequireImgpackagerequire......
  • 使用 Chapel 实现滑动验证码识别
    滑动验证码识别是一种基于图像处理的技术,用于识别滑块的缺口位置。本篇文章将演示如何使用Chapel语言实现一个简单的滑动验证码识别程序。Chapel简介Chapel是一种并行编程语言,适合数据密集型计算任务。我们可以利用其强大的数组和数据处理能力完成图像分析。环境准备安装Ch......
  • 使用 Neko 编程语言实现简单的滑动验证码识别
    滑动验证码是一种常见的安全验证方式,要求用户将图块拖动到正确位置。本文将使用Neko编程语言实现一个简单的滑动验证码识别程序,通过基本的图像处理技术自动识别图块匹配位置。实现步骤加载图片:使用Neko的图像处理库加载滑块和背景图片。图像预处理:转换为灰度图并进行边缘......
  • Tensorflow基本概念
    简介:本文从Graph讲到Session,同时讲解了tf.constant创建tensor的用法和variable需要初始化的知识点,可以给你打好一个学习Tensorflow的基础。本文都是基于TensorFlow1.14.0的版本下运行。本专栏将会系统的讲解TensorFlow在1.14.0版本下的各种用法并且会讲解各种常用的神经网......
  • 校园AI语音识别霸凌监控系统
    校园AI语音识别霸凌监控系统通过音频识别技术,校园AI语音识别霸凌监控系统针对校园内监控难以覆盖的区域,如厕所、宿舍、天台等,进行全天候的音频监控。系统通过识别特定的关键词,如“救命”、“老师救我”等,来监测可能发生的霸凌事件。系统采用YOLOv5AI音频算法,该算法能够对音频流进......
  • JAVA植物大全网站和百度AI植物智能识别系统(开题报告+作品+论文)
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • 人员背带夹佩戴识别智慧矿山一体机违规抽烟识别软硬一体化矿山智能解决方案
    在当今这个快速发展的数字化时代,智慧矿山的建设已经成为矿业领域转型升级的重要方向。为了实现矿山的智能化、自动化和信息化提出了一套全面的解决方案,人员背带夹佩戴识别智慧矿山一体机旨在通过技术创新和系统集成,打造一个高效、安全、环保的智慧矿山环境。以下是对智慧矿山一体......
  • AI智能检测视频分析网关安全帽检测识别监控解决方案
    在当代建筑行业中,保障工人的安全始终是最为紧迫的议题。事故如高空坠落和物体撞击等频繁发生,严重威胁着工人的生命安全。安全帽作为一项基础的个人防护设备,其正确使用对于减轻事故伤害起着至关重要的作用。不过,依赖传统的人工检查方法不仅效率不高,还可能存在疏漏和错误判断,难以实......
  • 使用 Janet 实现简单的文字识别
    文字识别(OCR)是将图像中的文本转化为计算机可读文本的技术。Janet是一种轻量级的嵌入式脚本语言,适用于各种任务,从数据处理到简单的文本识别任务。本文将介绍如何在Janet中编写一个简单的文字识别程序。代码实现在Janet中,文字识别的实现需要借助图像处理库。虽然Janet没有......