Tensorflow学习三

昨天刚刚把MNIST的代码在电脑上运行,还没有仔细看代码的含义,今天就跟着中文官网一起继续。


MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片,也包含每一张图片对应的标签,告诉我们这张图片是数字几。

MNIST数据集

首先我们可以通过python的源代码用于自动下载和安装这个数据集。

import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

下载下来的数据集被分成两部分:60000行的训练数据集( mnist.train )和10000行的测试数据集( mnist.test )。

每一个MNIST数据单元都有两部分组成:一张包含手写数组的图片和一个对应的标签。我们把这些图片设为"xs",把这些标签设为”ys"。寻训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images ,训练数据集的标签是mnist.train.labels。

每一张图片包含28像素X28像素。我们可以用一个数字数组来表示这张图片:
我们把这个数组展开成一个向量,长度是28x28 = 784。,在MNIST训练数据集中,mnist.train.imags是一个形状为[60000,784]的张量,第一个维度数字用来索引图片,第二个纬度数字用来索引每张图片中的像素点。因此张量里的每一张元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。

相对应的MNIST数据集的标签是介于0到9的数字,用来描述给定图片里表示的数字,为了用于这个教程,我们使标签数据是“one-hot vectors"。一个one-hot向量除了是某一一位的数字似乎1以外其余各维度数组都是0.所以在此教程总,数字n将表示成一个只有在第维度(从0开始)数字为1的10维向量。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0])。因此,mnist.train.labels是一个[60000,10]的数字矩阵。

softmax回归

我们使用softmax回归其实就是来给不同的对象分配概率。

softmax回归分为两步:

第一步:

为了得到一张给定图片属于某个特定数字类的证据,我们对图片像素值进行加权求和。如果这个像素有很轻的证据说明这张图片不属于该类,那么相应的权值为负数,反之,权值是正数。

此外,我们还需要一个额外的偏置量,因为输入往往会带有一些无关的干扰量。

可得softmax模型函数

(详见:http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html)

实现回归模型

首先,导入Tensorflow

import tensorflow as tf

 创建可操作的交互单元

x = tf.placeholder("float", [None, 784])
#x是一个占位符placeholder,在运行计算时具体输入x的值
#[None, 784]表示张量形状
#None表示此张量的第一个维度可以时任何长度的

 设权重值和偏置量

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
# Variable 代表一个可修改的张量
#全为零的张量用来初始化w和b,
# W 的维度是[784,10]
# b 的形状是[10]

 实现模型

y = tf.nn.softmax(tf.matmul(x,W) + b)
# tf.matmul(​​X,W) 表示 x 乘以 W 

 训练模型

这里使用交叉熵来评估这个模型

#训练模型
#添加一个新的占位符用于输入正确值
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#要求TensorFlow用梯度下降算法以0.01的学习速率最小化交叉熵
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#始化我们创建的变量
init = tf.initialize_all_variables()
#启动模型并初始化变量
sess = tf.Session()
sess.run(init)

#训练模型,让模型循环训练1000次
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})

 评估模型

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}))
原文地址:https://www.cnblogs.com/smile321/p/11187700.html