MNIST机器学习入门

来源:互联网 发布:qq飞车截图机器人源码 编辑:程序博客网 时间:2024/05/18 01:55

import tensorflow as tffrom tensorflow.examples.turtorials.mnist import input_data

用于自动下载安装数据集,60000行(mnist.train)的训练数据集和10000行(mnist.test)的测试数据集

每一个mnist数据单元有两部分组成,一张包含手写数字的图片和一个对应的标签。图片设为“xs”,标签

设为“ys”,训练数据集合测试数据集都包含xs和ys,


在mnist训练数据集中,mnist.train.images是形状为【60000,784】的张量,第一是索引图片,第二个是索引

每张图片中的像素点。

相对应的MNIST数据集的标签是介于0-9的数字,用来描述给定图片里表示的数字,教程把n表示成只有在第n

唯独数字为1的10维向量,因此mnist.train.labels是一个【60000,10】的数字矩阵


softmax回归介绍

分两步,第一步:

为了得到一张给定图片属于某个特定数字类的证据(evidence),对像素值进行加权求和


bi:代表数字i类的偏置量,j代表给定图片x的像素索引与像素求和,然后应softmax函数

可以把这些证据转换成概率y:



softmax可以看成是一个激励函数或者链接函数

可以通过操作符变量来定义这些可以交互的操作单元

x = tf.placeholder("float", [None, 784])

x 不是一个特定的值,而是一个占位符placeholder ,我们在TensorFlow运行计算时输入这个值。我们希望能够
输入任意数量的MNIST图像,每一张图展平成784维的向量。我们用2维的浮点数张量来表示这些图,这个张量的形
状是[None,784 ] 。(这里的None 表示此张量的第一个维度可以是任何长度的。)

W = tf.Variable(tf.zeros([784,10]))b = tf.Variable(tf.zeros([10]))

我们赋予tf.Variable 不同的初值来创建不同的Variable :在这里,我们都用全为零的张量来初始化W 和
b 。因为我们要学习W 和b 的值,它们的初值可以随意设置。

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


训练模型

为了训练我们的模型,我们首先需要定义一个指标来评估这个模型是好的。其实,在机器学习,我们通常定义指
标来表示一个模型是坏的,这个指标称为成本(cost)或损失(loss),然后尽量最小化这个指标。但是,这两
种方式是相同的。


一个非常常见的,非常漂亮的成本函数是“交叉熵”(cross-entropy)


为了计算交叉熵,我们首先需要添加一个新的占位符用于输入正确值:

y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))


在这里,我们要求TensorFlow用梯度下降算法(gradient descent algorithm)以0.01的学习速率最小化交叉
熵。梯度下降算法(gradient descent algorithm)是一个简单的学习过程,TensorFlow只需将每个变量一点点
地往使成本不断降低的方向移动。

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})

该循环的每个步骤中,我们都会随机抓取训练数据中的100个批处理数据点,然后我们用这些数据点作为参数替换
之前的占位符来运行train_step 。


模型评估

 

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
tf.argmax 是一个非常有用的函数,它能给你在一个张量里沿着某条轴的
最高条目的索引值。比如, tf.argmax(y,1) 是模型认为每个输入最有可能对应的那些标签,而tf.argma
x(y_,1) 代表正确的标签。 我们可以用tf.equal 来检测我们的预测是否真实标签匹配。


这行代码会给我们一组布尔值。为了确定正确预测项的比例,我们可以把布尔值转换成浮点数,然后取平均
值。例如, [True, False, True, True] 会变成[1,0,1,1] ,取平均值后得到0.75 .