TensorFlow 学习(3)——MNIST机器学习入门

经过对MNIST的学习,对TensorFlow和机器学习快速上手。python

MNIST:手写数字识别数据集算法

 

MNIST数据集数组

60000行的训练数据集 和 10000行测试集机器学习

每张图片是一个28*28的像素图。用一个数字数组来表示这张图片。这里把这个数组展开成一个向量,长度为28*28=784。(其实展平图片丢失了许多关键的二维结构信息,但这里他这么作了)ide

训练集包括两部分:索引图片集[60000,784],标签集[60000,10]函数

标签机使用的是 one-hot vectors。一个one-hot向量除了某一位数字是1之外其余都是0.因此在此教程中,数字n将表示成一个只有在第n维度数字是1的10维变量。例如标签0标位[1,0,0,0,0,0,0,0,0,0]性能

 

Softmax回归学习

softmax模型能够用来给不一样的对象分配几率。测试

通常分为两步。优化

第一步:

寻找证据(evidense):须要找到数据中证实该图片是某标签的证据,或者不是某标签的证据。以本图为例,若是某个像素具备很强的证听说明这张图片不属于该类,则相应的权值为负数;反之若是这个像素拥有有力的证据支持这张图片属于这个类,则权值为正数。最后再对这些像素值进行加权求和。持外,咱们也须要加入一个额外的偏置量(bias),由于输入每每带有一些无关的干扰量。所以对于给定的输入图片x它表明的是数字i的证据能够表示为

其中Wi表示权重,bi表示数字i的偏置量,j表示给定图片x的像素索引用于像素求和。而后用softmax函数能够把这些evidence转化为几率

 

这里softmax能够看作一个激励函数(activation)或者link函数,将咱们定义的线性函数的输出转换为咱们想要的几率形式。所以,给定一个图片,他对于每一个数字的吻合度能够被softmax转化为一个几率值。一个典型的softmax函数为:

 

展开右边的式子,有:

 但更多时候把softmax模型函数定义为前一种形式:把输入值当成幂指数求值,再正则化这些结果值。这个幂运算表示,更大的证据对应更大的假设模型里面的乘数权重值。反之,拥有更少的证据意味着在假设模型里面拥有更小的乘数系数。假设模型里的权值不能够是0值或者负值。Softmax而后会正则化这些权重值,使他们的总和等于1,以此构造一个有效的几率分布。

     

实现回归模型

  为了用python实现高效的数值计算,通常会使用Numpy这样的函数库,会把相似于矩阵乘法这样的复杂运算使用其余的外部语言实现。然而频繁于python和外部语言切换是一笔很大的开销。

TensorFlow也吧复杂运算放在python外部完成,可是为了不这些开销,它作了进一步完善。这里就是咱们说的先构造图在运算,而不是进行单一的复杂运算。

#!/usr/bin/env python

import os
os.environ['TF_CPP_MIN_LOG+LEVEL'] = '2'
import tensorflow as tf

x = tf.placeholder(tf.float32,[None,784])
#这里x是一个占位符,咱们不但愿直接所有读入全部的图,而是在运行计算时动态的读入这些图

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#Variable 表示一个能够修改的张量。它们能够用于计算输入值,也能够在计算中被修改。

y = tf.nn.softmax(tf.matmul(x,W) + b)
#tf.matmul(x,W)表示x乘以W(注意是矩阵相乘)

 

训练模型

  为了训练咱们的模型,咱们首先须要定义一个损失函数,而后尽可能最小化这个指标。一个比较经典的成本函数是交叉熵

                     

  y是咱们预测的几率分布,y‘是实际的分布(咱们输入的 one-hot vector)。比较粗糙的理解是,交叉熵し用来衡量咱们预测用于描述用于描述真相的低效性。

y_ = tf.placeholder('float',[None,10])
#用来存储正确的值

cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#这里交叉熵不只仅用来衡量单一的一对预测和真实值,而是全部100幅图片的交叉熵的总和。对于100个数据点的预测表现び对单一数据点的表现能更好地描述咱们的模型的性能

#TensorFlow拥有一张描述你各个计算单元的图,它能够自动地使用反向传播算法来有效的肯定你的变量是如和影响你要最小化的那个成本值的。而后,TensorFlow会用你选择的优化算法来不断的修改变量下降成本
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#这里要求TensorFlow使用梯度降低算法以0.01的学习速率最小化交叉熵。固然TensorFlow还集成了许多其余优化算法。
#TensorFlow在这里实际上作的是,在后台给描述你的计算的那张图里加上一系列新的计算操做单元用于实现反向传播算法和梯度降低算法。而后它返回给你的只是一个单一的操做,当运行这个操做时,タ用梯度降低算法训练你的模型,微调你的变量,不断减小成本

init = tf.initialize_all_variables()

with tf.Session() as sess:
sess.run(init)
for i in range(1000):#让模型循环训练1000次
batch_xs,batch_ys = mnist.train.next_batch(100)#随机抓取训练数据中的100个批处理数据点
sess.run(train_step,feed_dict = {x:batch_xs,y: batch_ys})

 

评估模型

如何评估咱们的模型?

首先找出那些预测正确的标签。tf.argmax是一个很是有用的函数。它能给出某个tensor对象在某一位上的其数据最大值所在的索引值。因为标签向量是由0,1组成,所以最大值1所在的索引位置急速类别标签,好比tf.argmax(y,1)返回的是模型对于任意输入x预测到的标签值,而tf.argmin(y_,1),咱们能够用tf.equal来检测咱们的预测值是否正确。

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

这行代码会给咱们一组布尔值。为了求出预测准确率,咱们将布尔值转化为1和0,在将其相加求平均值

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

最后,咱们计算所学习到的模型在测试数据集上的正确率

print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
相关文章
相关标签/搜索