初级图像识别——手写数字识别

  • 背景知识储备
    • Softmax Regression
    • MNIST
    • 矩阵相乘
    • One Hot 编码
    • Cross Entropy(交叉熵)
  • 代码实现
    • 引入数据
    • 设计数据结构
    • 完成函数实现
    • 定义损失
    • 定义优化
    • 运算启动

背景知识储备

Softmax Regression

Softmax Regression(回归) 是面向多项分布数据解决多分类问题的算法。其他可用于解决该种问题的方法有决策树、朴素贝叶斯等。但是这个算法十分重要,因为目前的资料显示卷积神经网络和循环神经网络的最后一层也是在使用这个算法。

这个算法的具体原理是将判定为某一个类(预先分类)的特征相加,然后将这些特征转化为判定是这一分类的概率。而这些特征可以通过一些算法来获取,比如加权求和。如下 Wi,jW_{i,j}Wi,j​可以表示针对第i个分类面向第j个元素的权重(weight),而 bib_ibi​则表示针对第i个特征的偏差值(bias)。
featurei=∑jWi,j xj+bifeature_i = \sum_j W_{i,j} \: x_j+ b_i featurei​=j∑​Wi,j​xj​+bi​

当然以上只是特征化处理,以下才是softmax的公式。首先我们把以上的特征公式的结果用exp函数进行处理(即以特征值为指数以自然常数e为底数求幂),这样可以确保所有概率为正。以下为书本公式。
softmax(x)i=normalize(exp⁡xi)=exp⁡xi∑jexp⁡xjsoftmax(x)_i = normalize(\exp{x_i}) = \frac{\exp{x_i}}{\sum_j \exp{x_j}} softmax(x)i​=normalize(expxi​)=∑j​expxj​expxi​​
个人认为以上公式稍微容易误导而且产生理解困难稍作改动,方便不熟悉exp函数常规表达的人理解。

softmax(x)i=P(Y=i∣X=x)=normalize(efeaturei)=efeaturei∑jefeaturejsoftmax(x)_i = P(Y = i| X = x)= normalize(e^{feature_i}) = \frac{e^{feature_i}}{\sum_j e^{feature_j}} softmax(x)i​=P(Y=i∣X=x)=normalize(efeaturei​)=∑j​efeaturej​efeaturei​​
公式解释为:在引入数据集x的情况下分类i在所有分类中概率分布的值。

从以上公式我们可以看出,softmax的最终功能就是将得出的特征值的幂与所有特征值的幂的和进行比较得出概率。也就因此,可以在分类问题中在可以可以预测数据的特征倾向。

MNIST

MNIST 全称 Mixed National Insitute of Standards and Technology database 是一个简易的机器视觉数据集。里面的素材是 28*28的手写数字,其像素格内数据表示该像素格的灰度值。

值得注意的是虽然代码可以自行下载该数据集,可是一般情况下并无法正常开始或结束下载,目前的解决方法为到文章Yann LeCun’s MNIST page处手动下载并放入项目文件夹下的"MNIST_data"文件夹下。

矩阵相乘

矩阵相乘算是一个高等数学的基本概念了,虽然在Tensorflow 的学习中我们并不需要亲自做矩阵运算,但是我们还是要了解其概念来帮助我们设计程序。而矩阵相乘的特性基本可以归结为以下公式。

  1. 所产生的新矩阵中第(i,j)位置的值的计算方法
    (AB)ij=∑k=1paikbkj(AB)_{ij} = \sum ^p _{k=1} a_{ik}b_{kj} (AB)ij​=k=1∑p​aik​bkj​
  2. 一个形状为(m,p)的矩阵乘以一个(p,n)的矩阵会的出一个(m,n)d的矩阵
    (a11⋯a1p⋮⋱⋮am1⋯amp)∗(a11⋯a1n⋮⋱⋮ap1⋯apn)=(a11⋯a1n⋮⋱⋮am1⋯amn)\begin{pmatrix} a_{11} & \cdots & a_{1p}\\ \vdots & \ddots & \vdots\\ a_{m1} & \cdots & a_{mp} \end{pmatrix} * \begin{pmatrix} a_{11} & \cdots & a_{1n}\\ \vdots & \ddots & \vdots\\ a_{p1} & \cdots & a_{pn} \end{pmatrix} = \begin{pmatrix} a_{11} & \cdots & a_{1n}\\ \vdots & \ddots & \vdots\\ a_{m1} & \cdots & a_{mn} \end{pmatrix} ⎝⎜⎛​a11​⋮am1​​⋯⋱⋯​a1p​⋮amp​​⎠⎟⎞​∗⎝⎜⎛​a11​⋮ap1​​⋯⋱⋯​a1n​⋮apn​​⎠⎟⎞​=⎝⎜⎛​a11​⋮am1​​⋯⋱⋯​a1n​⋮amn​​⎠⎟⎞​

One Hot 编码

One Hot 编码又称独热编码,其特性为仅有一维为有效编码。在分类问题中正好可以将每一维对应一个分类。

Cross Entropy(交叉熵)

在这个内容中,CE是作为我们的测试的损失值(不精确值)的计算思路。笔者没能找到其具体的设计思路,但是确实这个公式对于概率分布型的数据模型有极好的表现效果。
在此提一下,书中提到该方法是多分类问题中对于损失值计算的通常方法,但是该方法仅适用于概率分布型数据。某著名院校在404网站的Loss Function and Optimization 课时中就展示了多分布问题的原初处理(SVM即评分化)和其对应的损失方程(hinge loss)。 在实际操作中我们也可以发现,如果我们不将结果概率化,导致所产生的值小于0或大于1会对CE方法造成bug和因差别过小产生的计算失效。以下为具体方程
Li=−log⁡(esyi∑jesj)=−log⁡(softmax(i))L_i = -\log(\frac{e^{s_{y_i}}}{\sum_j{e^{s_j}}}) = -\log(softmax(i)) Li​=−log(∑j​esj​esyi​​​)=−log(softmax(i))
当然为了方便编程时理解我们将其再做处理
Hy′(y)=−∑iyi′log(yi)H_{y'}(y) = -\sum_i{y'_ilog(y_i)} Hy′​(y)=−i∑​yi′​log(yi​)
其中y’表示的是对应的label而y则是运算得出的某项分类的概率。由于label为独热编码所以仅有正确分类的概率值会被获取。

代码实现

引入数据

from tensorflow.examples.tutorials.mnist import input_data
# 对于tensorflow 的引入是下一部分内容,这里为了代码整洁提前放入
import tensorflow as tf
# 该块代码会自动下载MNIST的数据集到项目目录下的"MNIST_data"文件夹下
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)

该数据集分为三个集合两个类,三个集合为训练集、测试集、验证集;两个类为图像集和标签集。两个分类基于对于信息标注的需求,标签集会为图像集中每一个数据提供一一对应的信息标注,以方便取用。而三个集合则对应其不同的功能,训练集用于模型训练;验证集用于判断训练效果以确定是否结束训练(原话为决定合适完成训练);测试集用于评测最终训练成果(通过准确率、召回率、F1-score等评测)。
而第二个参数one_hot=True则选择了标签集的编码方式为独热编码

设计数据结构

在此我们需要把获取到的28x28的图像展开成一维的长度为784的向量(或称784维的向量)。书中对于这种操作的解释是该部分的任务十分简单,即使不保留像素间的空间关系也可以完成,故而将其简化为可以一步完成softmax的数据结构(因为softmax的最终结果为以分类数为维数的向量)。

而根据我们之前对于softmax的回归的学习,我们确定我们运算的结果应该是一个10维的向量。所以我们定义的权重应该是10x784的矩阵(请注意矩阵形状与python数组定义时的差别)。而bias则是一个10维向量

# 首先建立与tensorflow的回话这样才能够调用tensorflow以发挥效用
sess = tf.InteractiveSession()
# 根据我们设计好的数据结构来构建 输入数据x 权重W 和偏向 b
x = tf.placeholder(tf.float32,[None,784])
# 此处输入数据x 的数据构建使用的是placeholder方法
# 该方法在TensorFlow 中专门用于定义自变量(数据集)
# 以方便数据集不断放入程序(个人觉得类似流处理)
# 其中第一个参数定义数据类型,第二个参数指代tensor 的shape(结构)
# 但值得注意的是第一个None(不指定数值)指的是不限输入条数(矩阵列数,数组行数)
# 而第二位才指定矩阵行数
# W和b的设定就简单了,按照预设的结构初始化为全是0的矩阵
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

完成函数实现

以下公式就是我们上面写过的算法公式的代码实现,其中tf.matmul就是矩阵乘法,tf.nnsoftmax 就是调用softmax算法。再顺便提一下tf.nn就是tensorflow下所有对于神经网络的库。

y = tf.nn.softmax(tf.matmul(x,W)+b)

定义损失

我们明白神经网络实现的重点在于训练,因而我们会需要一个loss function 来描述我们定义的模型对于该分类问题的分类精度。 loss(损失)越小,分类结果与真实值的偏差就越小,换言之模型就越精确。
在我们之前的代码里,我们设定了全0的权重和偏差值。在直接使用的情况下会产生一个loss值,而训练的目的就是将这个loss不断减。
书中提供了cross entropy作为 loss function. 按照我们之前的介绍来编写代码

# 我们需要将label放入y'中所以我们要想之前一样产生占位变量
y_ = tf.placeholder(tf.float32,[None,10])
# 此处就是具体的CE定义
# reduce就是map reduce中的reduce,聚合数据产生结果
# axis是对于reduce方法的确认,具体可以看reduce sum的文件
# 但值得注意的是axis 原参数名为 reduction_indices,在文档中确认即将desperated 所以采用了参数axis。
# 和我们的方程不同的是我们最后要取得一个损失均值来确认权重和偏差值的总体效果
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),axis=[1]))

定义优化

在这个部分我们要为具体的优化算法进行定义。当然Tensorflow 已经早已为我们准备好了一切。在tf.train包下存储了大量优化器。而这次我们使用的则是SGD(Stochastic Gradient Descent) 也就是随机梯度下降优化。根据书中的解释,该优化会跟就变量变化自动求导并根据反向传播算法进行训练以求每一轮迭代时可以在更新参数时达成减小损失的目。

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

运算启动

# 初始化变量和数值
tf.global_variables_initializer().run()
#循环1000遍随机抽取100条图像和label并喂入训练机
for i in range(1000):batch_xs, batch_ys = mnist.train.next_batch(100)train_step.run({x: batch_xs, y_:batch_ys})
# 定义预测(预期)集
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
# 定义准确率方程
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 放入具体数据集并输出准确率
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))

以上就是对于Tensorflow 最基础练习手写数字识别的知识总结和代码实现逻辑。

Tensorflow 学习入门(二) 初级图像识别——手写数字识别相关推荐

  1. tensorflow应用:双向LSTM神经网络手写数字识别

    tensorflow应用:双向LSTM神经网络手写数字识别 思路 Python程序1.建模训练保存 Tensorboard检查计算图及训练结果 打开训练好的模型进行预测 思路 将28X28的图片看成2 ...

  2. 深度学习导论(5)手写数字识别问题步骤

    深度学习导论(5)手写数字识别问题步骤 手写数字识别分类问题具体步骤(Training an handwritten digit classification) 加载数据 显示训练集中的图片 定义神经 ...

  3. matlab 对mnist手写数字数据集进行判决分析_人工智能TensorFlow(十四)MINIST手写数字识别...

    MNIST是一个简单的视觉计算数据集,它是像下面这样手写的数字图片: MNIST 每张图片还额外有一个标签记录了图片上数字是几,例如上面几张图的标签就是:5.0.4.1. MINIST数据 MINIS ...

  4. Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类

    本文适合于对机器学习和数据挖掘有所了解,想深入研究深度学习的读者 1.对概率基本概率有所了解 2.具有微积分和线性代数的基本知识 3.有一定的编程基础(Python) Java软件研发工程师转行之深度 ...

  5. Kaggle入门预测赛,手写数字识别Digit Recognizer,使用Kaggle kernel作答,F=0.98

    1.问题和描述 直接在kaggle左边的competition竞赛中搜索Digit Recognizer即可进入赛题页面: https://www.kaggle.com/c/digit-recogni ...

  6. 用tensorflow.js实现浏览器内的手写数字识别

    原文 简介 Tensorflow.js是google推出的一个开源的基于JavaScript的机器学习库,相对与基于其他语言的tersorflow库,它的最特别之处就是允许我们直接把模型的训练和数据预 ...

  7. 机器学习入门-kNN算法实现手写数字识别

    实验环境 Python:3.7.0 Anconda:3-5.3.1 64位 操作系统:win10 开发工具:sublime text(非必要) 简介 本次实验中的重点为采用kNN算法进行手写数字识别, ...

  8. pytorch 入门(二) cnn 手写数字识别

    import torch import torch.nn as nn import torchvision.datasets as normal_datasets import torchvision ...

  9. 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

              # 前向传播:描述了网络结构 minist_forward.py # 反向传播:描述了模型参数的优化方法 mnist_backward.py # 测试输出准确率minist_tes ...

最新文章

  1. 使用 Vml 制作立体柱状投票统计图的完整程序
  2. python语法实例_python基本语法练习实例
  3. c++11-auto,nullptr
  4. 谁能够在萧条中生存?历史总是惊人相似的(转)
  5. ​KDD 2019 | 用户视角看世界:腾讯提出ConcepT概念挖掘系统,助力推荐搜索
  6. 深入理解softmax函数
  7. leetcode 1838. 最高频元素的频数
  8. 【知识连载】 如何用钉钉宜搭制定企业疫情防控数字化管理方案
  9. XML Tree Editor(树形视图XML编辑器) v0.1.0.35
  10. 20种小技巧,玩转Google Colab
  11. 为什么python发展的好_为什么Python发展这么快,有哪些优势?
  12. ThinkPHP5最新URL访问:PATH_INFO和兼容模式
  13. windows 2003 复制大文件提示系统资源不足的官方处理方法
  14. 除了秀米,微信排版还有什么好用的? ---短网址
  15. 2008和2016哪个服务器系统好,windows2012和windows2016哪个好还是win2019、win2008
  16. 小学语文三年级阅读理解专项练习附答案~水上飞机
  17. 微信小程序封装图片合成水印
  18. 【STM32】使用BRR与BSRR寄存器控制GPIO输出
  19. 【数论】君と彼女の恋
  20. Java开发工程师--面试题(珍藏版)

热门文章

  1. OpenCV—python 简单的图像质量检测
  2. 2010年10月51CTO壁纸点评活动获奖名单【已结束】
  3. 世界杯期间 互联网彩票的绝地求生之路
  4. JAVA split 英文句号
  5. 四个干净高效的搜索引擎
  6. cracking_game逆向分析
  7. word文档因为文档保护而不能编辑的解决办法
  8. w10的 Google Tensorflow Object Detection API安装
  9. Starling Feathers Controls PageIndicator
  10. Redis 对象的数据结构原理 - SDS、Inset、Dict、ZipList、QuickList、SkipList、RedisObject