ADDOPS团队籍鑫璞 360云计算 算法
该文章出自于ADDOPS团队,经过上一篇《三分钟读懂tensorflow》,相信你们对tensorflow的核心概念以及编程模式有了有了必定的了解,今天该文章将结合一个手写数字识别(MNIST)模型来进一步了解tensorflow的使用。但愿能激发起你们的一些兴趣.
PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!编程
学习一门编程语言,都是从最基本的“hello world”开始的,做为一个编程模式,tensorflow也有本身的“hello world”--MNIST。它是计算机视觉的最基础且最多见的数据集,由70000张28像素28像素的手写数字组成,每一个图片对应一个标签,分别是0~9之间的一个数字。这70000个样本包含55000个训练样本,10000个测试样本以及5000个验证样本。咱们随机选取了该数据集中的四个样本,以下图,它们对应的标签分别是5,0,4和1。
你们知道,电脑识别图片是从最基本的单元--像素开始的,为了将上面的手写数字转换成电脑可以识别的信号,咱们引入灰度概念,将2828个像素点转换成灰度值(0到1区间内的一个值)。下图是将标签为1的图片转换成28乘以28的矩阵。
数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。同时,训练的数据将是一个55000*10的张量,第一个维度数字用来索引图片,第二个维度是label的向量。好比数字0,对应的label就是[1,0,0,0,0,0,0,0,0,0]。
这篇文章的主要任务是创建一个模型,可以识别手写的数字图片,获得0~9之间的值,即进行分类。目前实现MNIST模型有不少种,有的准确率超过90%以上,可是咱们须要从最简单的Softmax Regression来开始。机器学习
咱们知道MNIST的每一张图片都表示一个数字,从0到9。咱们但愿获得给定图片表明每一个数字的几率。好比说,咱们的模型可能推测一张包含9的图片表明数字9的几率是80%可是判断它是其余数字的几率比80%的几率要低。softmax模型能够用来给不一样的对象分配几率,即便在以后,咱们训练更加精细的模型时,最后一步也须要用softmax来分配几率。
Softmax Regression的工做原理很简单,将特征相加,而后将这些特征转化为断定是这类的几率。好比,某个像素的灰度值大表明极可能是数字n时,这个像素的权值就会很大;相反,若是不太多是n,则权重有多是负数。
咱们能够将这些特征写出以下的公式,i表明第i类(0到9的值),j表明一张图片的第j个像素,bi是一个偏差项。
获得全部像素的和之后,咱们用softmax函数能够把这些证据转换成几率y。
咱们将获得某个图片标签是0到9的几率值,咱们取几率值最大的标签,即为该图片表示的数字。编程语言
接下来咱们用tensorflow来实现一个softmax regression。在tensorflow中,定义一个softmax模型比较简单,只须要下面五行。ide
import tensorflow as tf x = tf.placeholder(tf.float32, [None, 784]) W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) y = tf.nn.softmax(tf.matmul(x,W) + b)
为了训练咱们的模型,咱们首先须要定义一个指标来评估这个模型是好的。其实,在机器学习,咱们一般定义指标来表示一个模型是坏的,这个指标称为成本(cost)或损失(loss),而后尽可能最小化这个指标。
一个很是常见的成本函数是“交叉熵”(cross-entropy)。交叉熵产生于信息论里面的信息压缩编码技术,可是它后来演变成为从博弈论到机器学习等其余领域里的重要技术手段。它的定义以下:
其中,y 是咱们预测的几率分布, y' 是实际的分布。
tensorflow中定义“交叉熵”也比较容易,代码以下:函数
y_ = tf.placeholder("float", [None,10]) cross_entropy = -tf.reduce_sum(y_*tf.log(y))
如今咱们有了算法softmax regression,又有了损失函数cross-entropy的定义,只须要定义一个优化算法便可开始训练。咱们采用常见的“随机梯度降低”来定义该优化方法,也比较容易,代码以下:学习
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
最后,咱们须要定义一个会话来运行上面的计算图,代码以下:测试
init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
本篇文章介绍了如何使用tensorflow来构建SoftMax Regression模型,从而实现对MNIST数据集的识别,但愿对tensorflow的使用有个简单的认识。接下来,咱们将更深刻的介绍tensorflow,但愿您持续关注系列文章。优化