千家信息网

单层的基础神经网络基于TensorFlow如何实现手写字识别

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇文章为大家展示了单层的基础神经网络基于TensorFlow如何实现手写字识别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。先上代码import tenso
千家信息网最后更新 2025年01月19日单层的基础神经网络基于TensorFlow如何实现手写字识别

本篇文章为大家展示了单层的基础神经网络基于TensorFlow如何实现手写字识别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

先上代码

import tensorflow  from tensorflow.examples.tutorials.mnist import input_data  import matplotlib.pyplot as plt    # 普通的神经网络学习  # 学习训练类  class Normal:        weight = []      biases = []        def __init__(self):          self.times = 1000          self.mnist = []          self.session = tensorflow.Session()          self.xs = tensorflow.placeholder(tensorflow.float32, [None, 784])          self.ys = tensorflow.placeholder(tensorflow.float32, [None, 10])          self.save_path = 'learn/result/normal.ckpt'        def run(self):          self.import_data()          self.train()          self.save()        def _setWeight(self,weight):          self.weight = weight        def _setBiases(self,biases):          self.biases = biases        def _getWeight(self):          return self.weight        def _getBiases(self):          return self.biases      # 训练      def train(self):            prediction = self.add_layer(self.xs, 784, 10, activation_function=tensorflow.nn.softmax)            cross_entropy = tensorflow.reduce_mean(              -tensorflow.reduce_sum(                  self.ys * tensorflow.log(prediction)                  , reduction_indices=[1])          )          train_step = tensorflow.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)            self.session.run(tensorflow.global_variables_initializer())            for i in range(self.times):              batch_xs, batch_ys = self.mnist.train.next_batch(100)              self.session.run(train_step, feed_dict={self.xs: batch_xs, self.ys: batch_ys})              if i % 50 == 0:                  # images 变换为 labels,images相当于x,labels相当于y                  accurary = self.computer_accurary(                      self.mnist.test.images,                      self.mnist.test.labels,                      prediction                  )        # 数据导入      def import_data(self):          self.mnist = input_data.read_data_sets('MNIST_data', one_hot=True)        # 数据保存      def save(self):          saver = tensorflow.train.Saver()          path = saver.save(self.session,self.save_path)        # 添加隐藏层      def add_layer(self,inputs,input_size,output_size,activation_function=None):            weight = tensorflow.Variable(tensorflow.random_normal([input_size,output_size]),dtype=tensorflow.float32,name='weight')            biases = tensorflow.Variable(tensorflow.zeros([1,output_size]) + 0.1,dtype=tensorflow.float32,name='biases')          Wx_plus_b = tensorflow.matmul(inputs,weight) + biases            self._setBiases(biases)          self._setWeight(weight)            if activation_function is None:              outputs = Wx_plus_b          else:              outputs = activation_function(Wx_plus_b,)            return outputs          # 计算结果数据与实际数据的正确率      def computer_accurary(self,x_data,y_data,tf_prediction):            prediction = self.session.run(tf_prediction,feed_dict={self.xs:x_data,self.ys:y_data})            # 返回两个矩阵中***值的索引号位置,然后进行相应位置的值大小比较并在此位置设置为True/False          correct_predition = tensorflow.equal(tensorflow.argmax(prediction,1),tensorflow.argmax(y_data,1))            # 进行数据格式转换,然后进行降维求平均值          accurary = tensorflow.reduce_mean(tensorflow.cast(correct_predition,tensorflow.float32))            result = self.session.run(accurary,feed_dict={self.xs:x_data,self.ys:y_data})            return result    # 识别类  class NormalRead(Normal):        input_size = 784      output_size = 10        def run(self):          self.import_data()          self.getSaver()          origin_input = self._getInput()          output = self.recognize(origin_input)            self._showImage(origin_input)          self._showOutput(output)          pass        # 显示识别结果      def _showOutput(self,output):          number = output.index(1)          print('识别到的数字:',number)        # 显示被识别图片      def _showImage(self,origin_input):          data = []          tmp = []          i = 1          # 原数据转换为可显示的矩阵          for v in origin_input[0]:              if i %28 == 0:                  tmp.append(v)                  data.append(tmp)                  tmp = []              else:                  tmp.append(v)              i += 1            plt.figure()          plt.imshow(data, cmap='binary')  # 黑白显示          plt.show()          def _setBiases(self,biases):          self.biases = biases          pass        def _setWeight(self,weight):          self.weight = weight          pass        def _getBiases(self):          return self.biases        def _getWeight(self):          return self.weight        # 获取训练模型      def getSaver(self):          weight = tensorflow.Variable(tensorflow.random_normal([self.input_size, self.output_size]), dtype=tensorflow.float32,name='weight')            biases = tensorflow.Variable(tensorflow.zeros([1, self.output_size]) + 0.1, dtype=tensorflow.float32, name='biases')            saver = tensorflow.train.Saver()          saver.restore(self.session,self.save_path)            self._setWeight(weight)          self._setBiases(biases)        def recognize(self,origin_input):          input = tensorflow.placeholder(tensorflow.float32,[None,784])          weight = self._getWeight()          biases = self._getBiases()            result = tensorflow.matmul(input,weight) + biases          resultSof = tensorflow.nn.softmax(result,) # 把结果集使用softmax进行激励          resultSig = tensorflow.nn.sigmoid(resultSof,) # 把结果集以sigmoid函数进行激励,用于后续分类          output = self.session.run(resultSig,{input:origin_input})            output = output[0]            # 对识别结果进行分类处理          output_tmp = []          for item in output:              if item < 0.6:                  output_tmp.append(0)              else :                  output_tmp.append(1)            return output_tmp        def _getInput(self):          inputs, y = self.mnist.train.next_batch(100);          return [inputs[50]]

以上是程序,整个程序基于TensorFlow来实现的,具体的TensorFlow安装我就不说了。

整个训练过程不做多说,我发现网上关于训练的教程很多,但是训练结果的教程很少。

整个程序里,通过tensorflow.train.Saver()的save进行训练结果模型进行存储,然后再用tensorflow.train.Saver()的restore进行模型恢复然后取到训练好的weight和baises。

这里要注意的一个地方是因为一次性随机取出100张手写图片进行批量训练的,我在取的时候其实也是批量随机取100张,但是我传入识别的是一张,通过以下这段程序:

def _getInput(self):          inputs, y = self.mnist.train.next_batch(100);          return [inputs[50]]

注意一下return这里的数据结构,其实是取这批量的第50张,实际上这段程序写成:

def _getInput(self):          inputs, y = self.mnist.train.next_batch(1);          return [inputs[0]]

会更好。

因为识别的时候是需要用到训练的隐藏层来进行的,所以在此我虽然识别的是一张图片,但是我必须要传入一个批量数据的这样一个结构。

然后再识别的地方,我使用了两个激励函数:

resultSof = tensorflow.nn.softmax(result,) # 把结果集使用softmax进行激励  resultSig = tensorflow.nn.sigmoid(resultSof,) # 把结果集以sigmoid函数进行激励,用于后续分类

这里的话,***个softmax激励后的数据我发现得到的是以e为底的指数形式,转换成普通的浮点数来看,不是很清楚到底是什么,那么我在做识别数字判断的时候就不方便,所以再通过了一次sigmoid的激励。

后续我通过一个循环判断进行一次实际上的分类,这个原因首先要说到识别结果形式:

[0,0,0,0,0,0,0,0,1,0]

像以上这个数据,表示的是8,也就是说,数组下表第几位为1就表示是几,如0的表示:

[1,0,0,0,0,0,0,0,0,0]

而sigmoid函数在这个地方其实就是对每个位置的数据进行了分类,我发现如果分类值小于0.52这样的数据其实代表的是否,也就是说此位置的值对应的是0,大于0.52应该对应的是真,也就是1;而我在程序里取的是0.6为界限做判断。

实际上,这个界限值应该是在神经网络训练的时候取的,而不是看识别结果来进行凭感觉取的(虽然训练的时候的参数也是凭感觉取的)

上述内容就是单层的基础神经网络基于TensorFlow如何实现手写字识别,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

数据 训练 结果 程序 分类 位置 时候 神经 神经网络 网络 函数 实际 也就是 图片 地方 实际上 模型 单层 基础 写字 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全的自查报告 华测rtk服务器ip地址是多少 闲鱼上出租服务器都是干什么的 企业信用信息基础数据库暂行办法 益阳网络安全保障 平谷区推广网络技术咨询一体化 软件开发云有什么意义 pc上位机软件开发 如何手工回退数据库 计算机网络技术与人工智能 医院数据库是互通的么 幻方量化服务器采购 网络安全切实从制度 国家网络安全工程师的标准是什么 网络安全法学专家 国泰安数据库有EDI数据嘛 内网拿下学校服务器 控制串口发送一次数据库 动作名称数据库图表 西安软件开发工资一般多少 高校地理空间数据库建设 网络安全实验分析 入侵数据库步骤 和平精英地区的服务器怎么进去 日照诚信积分管理软件开发系统 潜山网络安全咨询 帝国神话服务器管理员 qq邮箱服务器要怎么填 菏泽安卓软件开发哪家靠谱 蓝湖私有服务器地址是什么意思
0