TensorFlow学习笔记(二)-概念与流程理解

 Stardustsky   2017-03-24 10:24   2206 人阅读  0 条评论
1.tensorfolow运行流程
tensorflow运行流程主要有两步,分别是构造模型和训练。
在构造模型阶段,我们需要构建一个图(Graph)来描述我们的模型。所谓图,也可以理解为流程图,就是讲数据的输入->中间处理->输出的过程表示出来

1.png

此时不会发生实际运算。在模型构建完毕之后,会进入训练步骤。此时才会有实际的数据输入,梯度计算等操作,如何构建抽象的操作模型呢?这里就要提到tensorflow中的几个概念:Tensor,Variable,placeholder,而在训练阶段,则需要介绍Session。下面先解释一些上面的几个概念

2.概念描述
(1)Tensor
Tensor的意思是张量,实际也就是矩阵。可以理解为Tensorflow中矩阵的表示形式。Tensor的生成方式有很多种,最简单的就是
import tensorflow as tf 
   a = tf.zeros(shape=[1,5])
不过要注意,因为在训练开始前,所有的数据都是抽象的概念,也就是说,此时a只是表示这应该是个1*5的零矩阵,而没有实际赋值,也没有分配空间,所以如果此时print,就会出现如下情况:
print(a)
   #===>Tensor("zeros:0", shape=(1, 5), dtype=float32)
只有在训练过程开始后,才能获得a的实际值
sess = tf.InteractiveSession()
   print(sess.run(a))
   #===>[[ 0.  0.]]
这边设计到Session概念,后面会提到

(2)Variable
就是变量的意思。一般用于表示图中的个个计算参数,包括矩阵,向量等。比如我想展示一个relu模型(是一种激活函数),表达式就为
y=Relu(Wx+b)
这里的W、b就是要用来训练的参数,这两个值就可以用Variable来表示.Variable的初始函数有很多其他选项,这里先不提,只输入一个Tensor也是可以的
W = tf.Variable(tf.zeros(shape=[1,2]))
注意,此时W一样是一个抽象的概念,而且与Tensor不同,Variable必须初始化以后才有具体的值
tensor = tf.zeros(shape=[1,2])
   variable = tf.Variable(tensor)
   sess = tf.InteractiveSession()
   # print(sess.run(variable))  # 会报错
   sess.run(tf.initialize_all_variables()) # 对variable进行初始化
   print(sess.run(variable))
   #===>[[ 0.  0.]]
(3)Placeholder
又叫占位符,同样是一个抽象的概念。用于表示输入输出数据的格式。告诉系统:这里有一个值/向量/矩阵,现在我没法给你具体数值,不过我正式运行的时候会补上的!例如上式中的x和y。因为没有具体数值,所以只要指定尺寸即可
   x = tf.placeholder(tf.float32,[1, 5],name='input')
   y = tf.placeholder(tf.float32,[None, 5],name='input')
上面有两种形式,第一种x,表示输入是一个[1,5]的横向量。
而第二种形式,表示输入是一个[?,5]的矩阵。那么什么情况下会这么用呢?就是需要输入一批[1,5]的数据的时候。比如我有一批共10个数据,那我可以表示成[10,5]的矩阵。如果是一批5个,那就是[5,5]的矩阵。tensorflow会自动进行批处理

(4)Session
session也就是会话,主要作用是运行会话,合成Graph,其中又分为了一般的session和InteractiveSession,后者属于交互式会话,不需要sess.run(变量)这种形式,只需要使用tensor.eval()执行即可
直接使用Session()
import tensorflow as tf    
     
x = tf.constant(10)    
y = tf.constant(23)  
  
with tf.Session() as session:    
    print(sess.run(x))  
    print(sess.run(y))
使用InteractiveSession
import tensorflow as tf    
     
x = tf.constant(10)    
y = tf.constant(23)  
  
sess = tf.Interactive()  
  
print(x.eval())  
print(y.eval())  
  
sess.close()

3.Mnist数据测试
Mnist是一个官方提供的数据集,可用于对你的机器学习算法进行测试,以检测算法的准确度,其中包括了60000组训练图像和10000组测试图像,这些图像均是单一的手写出的数字图片,每个图像有28*28像素大小。每个像素值是0,表示白色,至255,表示黑色,中间像素表示不同的灰度值。数据集的样子大概如下:

2.png

该数据及可以在http://yann.lecun.com/exdb/mnist/进行下载,其中有四个文件,包含两个图象压缩包文件和两个标签文件。

3.png

万事俱备,接下来就是把这些数据用起来了,tensorflow中文网上面其实都有关于mnist用法的介绍。
import tensorflow as tf
import input_data
minist=input_data.read_data_set('Mnist',one_hot=True)
sess = tf.InteractiveSession()
//占位符placeholder
x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10])
//变量W,b在机器学习中,模型参数一般用Variable来表示
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
//初始化所有参数
sess.run(tf.initialize_all_variables())
//创建一个softmax模型,这个模型由线性回归函数Wx+b配合一个softmax函数构成,线性回归函数不用解释,softmax函数的主要作用是将其由线性变为了非线性,使其由简单的线性变为了神经网络,能够解决更加复杂场景下的应用,softmax函数本身其实就是sigmoid函数的一个简单变形体。
y = tf.nn.softmax(tf.matmul(x,W) + b)
//创建损失函数,将目标类别和预测类别的交叉熵进行叠加
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
//利用tensorflow自带的算法,找到各个变量的损失梯度值,规定步长为0.01。这一行代码实际上是用来往计算图上添加一个新操作,其中包括计算梯度,计算每个参数的步长变化,并且计算出新的参数值。
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
//返回的train_step操作对象,在运行时会使用梯度下降来更新参数。因此,整个模型的训练可以通过反复地运行train_step来完成。每一步迭代,我们都会加载50个训练样本,然后执行一次train_step,并通过feed_dict将x 和 y_张量占位符用训练训练数据替代。
for i in range(1000):
  batch = mnist.train.next_batch(50)
  train_step.run(feed_dict={x: batch[0], y_: batch[1]})
  //首先让我们找出那些预测正确的标签。tf.argmax 是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签,比如tf.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,而 tf.argmax(y_,1) 代表正确的标签,我们可以用 tf.equal 来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)。
  correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
  //计算出某一组batch预测结果平均值
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
  print accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})

4.png


本文地址:http://www.stardustsky.net/index.php/post/46.html
版权声明:本文为原创文章,版权归 Stardustsky 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?