TensorFlow 基本使用

一、 TensorFlow是什么?

是谷歌开源的机器学习实现框架,本文从Python语言来理解学习Tensorflow以及机器学习的知识。

TensorFlow的API主要分两个层次,核心层和基于核心层的高级API。核心层面向机器学习的研究人员,以及对模型控制精细的相关人员。高级API使用和学习相对容易,简化重复性任务,使不同的用户之间保持一致性。

高级API,如tf.contrib.learn可以帮助管理数据集data set,估计量estimators,训练training,推理inference

注意,一些高级API的方法名中包含contrib,意味着这些API依然处于开发过程中,这些方法在后续的TensorFlow版本中可能改变或者不再使用

这篇教程从核心层开始,后边会提到如何使用tf.contrib.learn实现模型。了解核心层,在使用高级API的时候知道程序是如何工作的。

1. 张量Tensors

数据的核心单元,一个tensor是一个包含任意维度的数组,张量的阶Tensor' rank是数组的维度,如下:

3 # 0阶张量,一个标量scalar with shape[]
[1. ,2., 3.] # 1阶张量; 一个向量vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] #  2阶 张量; 一个矩阵matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] #  3阶 张量tensor with shape [2, 1, 3]
2 是指[[1., 2., 3.]] 和 [[7., 8., 9.]]

1 是指[[1., 2., 3.]] 中有1个 [1., 2., 3.]

3 是指 [1., 2., 3.]中有3个:1., 2., 3.

二、 核心层TensorFlow Core学习

1. 引入TensorFlow

典型的引入语句:import tensorflow as tf

该语句是tensorflow的所有类,方法,符号的入口

2. 计算图Computational Graph

Tensorflow编程包含两个步骤:

1.构造计算图

2.运行计算图

计算图是什么?计算图是一系列的计算操作抽象为图中的节点。

构造一个简单的计算图:每个节点将0或多个tensor作为输入,输出一个tensor。一种类型的节点是常量节点constant,就如同tensorflow中的常数,它有0个输入,输出一个值。

构建两个浮点型tensor:node1和node2

[python] view plain copy
  1. node1 = tf.constant(3.0, tf.float32)  
  2. node2 = tf.constant(4.0# also tf.float32 implicitly  
  3. print(node1, node2)  

输出结果:

[python] view plain copy
  1. Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)  
需要说明,打印结果并不是我们期待的3.0 , 4.0,因为这是打印的节点(属于计算操作),当评估运行之后,才是我们期待的值。

评估一个节点,必须在一个会话Session中运行计算图,会话封装了Tensorflow运行时的状态和控制

接下来创建一个Session会话对象,调用run方法,运行计算图,去评估node1和node2

[python] view plain copy
  1. sess=tf.Session()  
  2. print(sess.run([node1,node2]))  
输出结果:

[python] view plain copy
  1. [3.04.0]  
可以使用计算操作将多个节点组合,构建更复杂的计算,例如将两个常量节点相加,产生一个新的计算图:

[python] view plain copy
  1. node3 = tf.add(node1, node2)  
  2. print("node3: ", node3)  
  3. print("sess.run(node3): ",sess.run(node3))  
输出结果:

[python] view plain copy
  1. node3: Tensor("Add:0", shape=(), dtype=float32)  
  2. sess.run(node3): 7.0  
Tensorflow提供了一个名为TensorBoard的部分,可以以图片的方式展示计算图。


这个计算图不是特别有趣,因为它产生的是一个常量结果。

计算图可以使用占位符placeholder参数化的从外部输入数据,placeholder的作用是在稍后提供一个值

[python] view plain copy
  1. # 构造计算图  
  2. a=tf.placeholder(tf.float32)  
  3. b=tf.placeholder(tf.float32)  
  4. adder_node=a+b  
  5. #运行计算图  
  6. print("adder_node:",adder_node)  
  7. print(sess.run(adder_node,{a:3,b:4.5}))  
  8. print(sess.run(adder_node,{a:[1,3],b:[2,4]}))  

输出结果:

[python] view plain copy
  1. adder_node: Tensor("add:0", dtype=float32)  
  2. 7.5  
  3. 3.  7.]  
我们可以添加一个操作,使计算图更加复杂:

[python] view plain copy
  1. add_and_triple=adder_node * 3  
  2. print("add_and_triple:",add_and_triple)  
  3. print("sess run result:",sess.run(add_and_triple,{a:3,b:4.5}))  
输出结果:

[python] view plain copy
  1. add_and_triple: Tensor("mul:0", dtype=float32)  
  2. sess run result: 22.5  

在机器学习中,需要模型可以任意输入,为了模型具有可训练能力,需要修正计算图,使对于同样的输入得到新的输出。变量Variable允许我们为计算图添加训练参数。

构造一个变量,需要提供类型和初始值:

[python] view plain copy
  1. W=tf.Variable([.3],tf.float32)  
  2. b=tf.Variable([-.3],tf.float32)  
  3. x=tf.placeholder(tf.float32)  
  4. linear_model=W*x+b  
常量节点在调用tf.constant时就被初始化,而变量在调用tf.Variable时并不初始化,必须显性的执行如下操作:

[python] view plain copy
  1. init = tf.global_variables_initializer()  
  2. sess.run(init)  
意识到init对象是Tensorflow子图初始化所有全局变量的句柄是重要的,在调用sess.run(init)方法之前,所有变量都是未初始化的。

因为x是一个占位符,我们可以指定几个值来评估linear_model模型(训练)

运行计算图:

[python] view plain copy
  1. print("linear_model:",linear_model)  
  2. print(sess.run(linear_model,{x:[1,2,3,4]}))  
得到输出:

[python] view plain copy
  1. linear_model: Tensor("add_1:0", dtype=float32)  
  2. 0.          0.30000001  0.60000002  0.90000004]  

我们创建了一个模型,但是不知道这个模型的效果怎么样,基于训练数据来评估模型,还需要一个placeholder y 来提供期望值,我们需要一个损失函数loss function

损失函数测量当前模型与真实数据之间的差距,对于线性模型,我们使用标准损失函数,求模型预测结果与实际数据之间差值的平方和sum the squares of the deltas

linear_model - y 构造了一个向量,对应每个元素的差值,我们调用tf.square求平方,使用tf.reduce_sum求和所有的平方差为一个标量scalar

[python] view plain copy
  1. y=tf.placeholder(tf.float32)  
  2. squared_deltas=tf.square(linear_model-y)  
  3. loss=tf.reduce_sum(squared_deltas)  
  4. print("loss:",loss)  
  5. print(sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))  
输出结果:

[python] view plain copy
  1. loss: Tensor("Sum:0", dtype=float32)  
  2. 23.66  
平方差为23.66

我们可以通过手动的方式将参数W和b置为W=-1,b=1,使模型最优,即损失函数最小。初始化后的变量可以通过tf.assign来更改,tf.assign后需要tf.run生效

[python] view plain copy
  1. fixW=tf.assign(W,[-1.])  
  2. fixb=tf.assign(b,[1.])  
  3. sess.run([fixW,fixb])  
  4. print("fix loss:",sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))  
输出结果:

[python] view plain copy
  1. fix loss: 0.0  
我们猜想最优的W和b值,但是在机器学习中,就是自动的寻找这些最优的模型参数。下节介绍》》

三、 API  tf. train 

Tensorflow提供了优化器Optimizer慢慢改变每个变量来最小化损失函数。最简单的Optimizer是梯度下降gradient descent,它根据损失函数相对于该变量的导数大小来修改参数值,一般来讲,手动计算导数是乏味且易出错的,Tensorflow可以使用方法tf.gradients自动的为给定模型计算导数。优化器通常做这个工作。

[python] view plain copy
  1. optimizer=tf.train.GradientDescentOptimizer(0.01)  
  2. train=optimizer.minimize(loss)  
  3. print("train: ",trian)  
  4. sess.run(init)#重置变量到初始化值  
  5. for i in range(1000):  
  6.     sess.run(train,{x:[1,2,3,4],y:[0,-1,-2,-3]})  
  7. print(sess.run([W,b]))  
输出结果:

[python] view plain copy
  1. train:  
  2.  name: "GradientDescent"  
  3. op: "NoOp"  
  4. [array([-0.9999969], dtype=float32), array([ 0.99999082], dtype=float32)]  
到此,我们实现了一次真实的机器学习,尽管我们只实现的是简单的线下回归,不需要多少Tensorflow core代码,然而复杂的模型和方法输入数据会需要更多的代码量,因此Tensorflow对于一般的模式、结构和功能提供了高级别的抽象。我们在下一章节学习。

完整的代码:

[python] view plain copy
  1. import tensorflow as tf  
  2. # NumPy is often used to load, manipulate and preprocess data.  
  3. import numpy as np  
  4. node1 = tf.constant(3.0,tf.float32)  
  5. node2 = tf.constant(4.0)  
  6. print(node1,node2)  
  7. sess=tf.Session()  
  8. print(sess.run([node1,node2]))  
  9. node3=tf.add(node1,node2)  
  10. print("node3:",node3)  
  11. print("sess.run(node3):",sess.run(node3))  
  12. # 构造计算图  
  13. a=tf.placeholder(tf.float32)  
  14. b=tf.placeholder(tf.float32)  
  15. adder_node=a+b  
  16. #运行计算图  
  17. print("adder_node:",adder_node)  
  18. print(sess.run(adder_node,{a:3,b:4.5}))  
  19. print(sess.run(adder_node,{a:[1,3],b:[2,4]}))  
  20. add_and_triple=adder_node * 3  
  21. print("add_and_triple:",add_and_triple)  
  22. print("sess run result:",sess.run(add_and_triple,{a:3,b:4.5}))  
  23.   
  24. W=tf.Variable([.3],tf.float32)  
  25. b=tf.Variable([-.3],tf.float32)  
  26. x=tf.placeholder(tf.float32)  
  27. linear_model=W*x+b  
  28. init = tf.global_variables_initializer()  
  29. sess.run(init)  
  30. print("linear_model:",linear_model)  
  31. print(sess.run(linear_model,{x:[1,2,3,4]}))  
  32.   
  33. y=tf.placeholder(tf.float32)  
  34. squared_deltas=tf.square(linear_model-y)  
  35. loss=tf.reduce_sum(squared_deltas)  
  36. print("loss:",loss)  
  37. print(sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))  
  38.   
  39. fixW=tf.assign(W,[-1.])  
  40. fixb=tf.assign(b,[1.])  
  41. sess.run([fixW,fixb])  
  42. print("fix loss:",sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))  
  43.   
  44. optimizer=tf.train.GradientDescentOptimizer(0.01)  
  45. train=optimizer.minimize(loss)  
  46. print("train: ",train)  
  47. sess.run(init)#重置变量到初始化值  
  48. for i in range(1000):  
  49.     sess.run(train,{x:[1,2,3,4],y:[0,-1,-2,-3]})  
  50.   
  51. curr_W, curr_b, curr_loss  = sess.run([W, b, loss],{x:[1,2,3,4],y:[0,-1,-2,-3]})  
  52. print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))  

四、 API tf. contrib. learn

tf.contrib.learn是Tensorflow高级别的库,简化机器学习:

1.运行训练循环

2.运行评估循环

3.管理数据集

4.管理feeding

tf.contrib.learn定义了许多常见的模型

1.基本使用

使用tf.contrib.learn简化线性回归:

numpy是开源的数值计算扩展,可以用来存储和处理大型矩阵。

声明特征列表list of features:我们在此使用一个real-valued列,另外还有其他复杂有用的列类型

[python] view plain copy
  1. import tensorflow as tf  
  2. import numpy as np  
  3.   
  4. features=[tf.contrib.layers.real_valued_column("x",dimension=1)]  
  5. print("features:",features)  
输出:

[python] view plain copy
  1. features: [_RealValuedColumn(column_name='x', dimension=1, default_value=None, dtype=tf.float32, normalizer=None)]  
声明估计器estimator,estimator负责调用训练和评估。它有很多预先定的类型,如线性回归linear regression, 逻辑回归logistic regerssion, 线性分类linear classification, 逻辑分类logistic classification, 以及许多神经网络分类器,回归器neural network classifiers and regressors

这里做线性回归,指定特征列表:

[python] view plain copy
  1. estimator=tf.contrib.learn.LinearRegressor(feature_columns=features)  
  2. print("estimator:",estimator)  
输出结果:

[python] view plain copy
  1. estimator: LinearRegressor(params={'head': <tensorflow.contrib.learn.python.learn.estimators.head._RegressionHead object at 0x7f6c88bcb208>, 'feature_columns': [_RealValuedColumn(column_name='x', dimension=1, default_value=None, dtype=tf.float32, normalizer=None)], 'optimizer'None'gradient_clip_norm'None'joint_weights'False})  
Tensorflow提供了很多方法读取和设置数据集,在这里我们使用numpy_input_fn,为该方法指定数据的批次数目num_epochs(how many batches of data ),以及每批次的大小batch_size

[python] view plain copy
  1. x=np.array([1.,2.,3.,4.])  
  2. y=np.array([0.,-1.,-2.,-3.])  
  3. input_fn=tf.contrib.learn.io.numpy_input_fn({"x":x},y,batch_size=4,num_epochs=1000)  
  4. print("input_fn:",input_fn)  
输出结果:

[python] view plain copy
  1. input_fn: <function numpy_input_fn.<locals>.input_fn at 0x7fb572e21e18>  
我们可以调用fit方法进行1000次训练步骤,并且传递训练数据集:

[python] view plain copy
  1. estimator.fit(input_fn=input_fn,steps=1000)  
评价模型,在真实例子中,我们会将验证和测试数据分离,以免过度拟合overftting
[python] view plain copy
  1. print(estimator.evaluate(input_fn=input_fn))  
输出结果:

[python] view plain copy
  1. {'loss'1.8005665e-07'global_step'1000}  
完整代码:

[python] view plain copy
  1. import tensorflow as tf  
  2. import numpy as np  
  3.   
  4. features=[tf.contrib.layers.real_valued_column("x",dimension=1)]  
  5. print("features:",features)  
  6. estimator=tf.contrib.learn.LinearRegressor(feature_columns=features)  
  7. print("estimator:",estimator)  
  8. x=np.array([1.,2.,3.,4.])  
  9. y=np.array([0.,-1.,-2.,-3.])  
  10. input_fn=tf.contrib.learn.io.numpy_input_fn({"x":x},y,batch_size=4,num_epochs=1000)  
  11. print("input_fn:",input_fn)  
  12. estimator.fit(input_fn=input_fn,steps=1000)  
  13. print(">>>>>>>>>>")  
  14. res=estimator.evaluate(input_fn=input_fn)  
  15. print(res)  

2. 定制化模型

tf.contrib.learn不限定用户使用预先定义的模型,假设我们创建一个Tensorflow中不存在的新模型,我们仍然可以保留tf.contrib.learn中的数据集、feeding、训练等

接下来,我们将实现类比于线性回归器LinearRegressor的自定义的线性回归模型。

使用tf.contrib.learn定制化模型,需要使用到类tf.contrib.learn.Estimator, 线性回归器tf.contrib.learn.LinearRegerssor就是tf.contrib.learn.Estimator的子类

通过为Estimator指定model_fn方法,控制模型如何评估,训练,损失等

[python] view plain copy
  1. import tensorflow as tf  
  2. import numpy as np  
  3. def model(features, labels, mode):  
  4.     # 构建线程模型以及预测值  
  5.     W=tf.get_variable("W",[1],dtype=tf.float64)  
  6.     b=tf.get_variable("b",[1],dtype=tf.float64)  
  7.     y=W*features['x']+b  
  8.     # 损失函数  
  9.     loss=tf.reduce_sum(tf.square(y - labels))  
  10.     # 训练子图  
  11.     global_step=tf.train.get_global_step()  
  12.     optimizer=tf.train.GradientDescentOptimizer(0.01)  
  13.     train=tf.group(optimizer.minimize(loss),tf.assign_add(global_step,1))  
  14.     # ModelFnOps方法将我们构造的子图连接到相应的功能  
  15.     return tf.contrib.learn.ModelFnOps(  
  16.         mode=mode,predictions=y,loss=loss,train_op=train)  
  17.   
  18. estimator=tf.contrib.learn.Estimator(model_fn=model)  
  19. # 构建数据集  
  20. x=np.array([1.,2.,3.,4.])  
  21. y=np.array([0.,-1.,-2.,-3.])  
  22. input_fn=tf.contrib.learn.io.numpy_input_fn({"x":x},y,4,num_epochs=1000)  
  23. # 训练  
  24. estimator.fit(input_fn=input_fn,steps=1000)  
  25. # 评价模型  
  26. print(estimator.evaluate(input_fn=input_fn,steps=10))  
说明,model方法中的内容与前边使用底层api的收到模型很相似


使用TensorFlow,你必须明白TensorFlow

  • 使用图(graph)来表示任务
  • 被称之为会话(Session)的上下文(context)中执行图
  • 使用tensor表示数据
  • 通过变量(Variable)维护状态
  • 使用feedfetch可以为任意操作(arbitrary operation)赋值或者从其中获取数据

综述

TensorFlow是一个编程系统,使用图来表示计算任务,图中的节点被称之为opoperation的缩写),一个op获得0个或者多个tensor,执行计算,产生0个或多个tensor。每个tensor是一个类型化的多维数组。例如,你可以将一组图像素集表示为一个四维浮点数数组,这四个维度分别是[batch, height, width, channels]

一个TensorFlow图描述了计算的过程,为了进行计算,图必须在会话里被启动,会话将图的op分发到诸如CPU或GPU之类的设备上,同时提供执行op的方法,这些方法执行后,将产生的tensor返回。在python语言中,返回的tensornumpy ndarry对象;在C/C++语言中,返回的是tensortensorflow::Tensor实例。

计算图

Tensorflow程序通常被组织成一个构建阶段和一个执行阶段,在构建阶段,op的执行步骤被描述成为一个图,在执行阶段,使用会话执行图中的op

例如,通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练op

Tensorflow支持C/C++,python编程语言。目前,TensorFlow的python库更易使用,它提供了大量的辅助函数来简化构建图的工作,这些函数尚未被C/C++库支持。

三种语言的会话库(session libraries)是一致的。

构建图

构件图的第一步是创建源op (source op)。源op不需要任何输入。源op的输出被传递给其它op做运算。

python库中,op构造器的返回值代表被构造出的op输出,这些返回值可以传递给其它op作为输入。

TensorFlow Python库中有一个默认图(default graph)op构造器可以为其增加节点。这个默认图对许多程序来说已经足够用了,可以阅读Graph文档,来了解如何管理多个视图。

import tensorflow as tf
# 创建一个常量op, 产生一个1x2矩阵,这个op被作为一个节点
# 加到默认视图中
# 构造器的返回值代表该常量op的返回值
matrix1 = tr.constant([[3., 3.]])

# 创建另一个常量op, 产生一个2x1的矩阵
matrix2 = tr.constant([[2.], [2.]])

# 创建一个矩阵乘法matmul op,把matrix1和matrix2作为输入:
product = tf.matmul(matrix1, matrix2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

默认图现在有三个节点,两个constant() opmatmul() op。为了真正进行矩阵乘法的结果,你必须在会话里启动这个图。

在一个会话中启动图

构造阶段完成后,才能启动图。启动图的第一步是创建一个Session对象,如果无任何创建参数,会话构造器将无法启动默认图。

欲了解完整的会话API,请阅读Session

# 启动默认图
sess = tf.Session()

# 调用sess的'run()' 方法来执行矩阵乘法op,传入'product'作为该方法的参数
# 上面提到,'product'代表了矩阵乘法op的输出,传入它是向方法表明,我们希望取回
# 矩阵乘法op的输出。
#
#整个执行过程是自动化的,会话负责传递op所需的全部输入。op通常是并发执行的。
#
# 函数调用'run(product)' 触发了图中三个op(两个常量op和一个矩阵乘法op)的执行。
# 返回值'result'是一个numpy 'ndarray'对象。
result = sess.run(product)
print result
# ==>[[12.]]

# 完成任务,关闭会话
sess.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Session对象在使用完成后需要关闭以释放资源,除了显式调用close外,也可以使用with代码来自动完成关闭动作:

with tf.Session() as sess:
  result = sess.run([product])
  print result
  • 1
  • 2
  • 3

在实现上,Tensorflow将图形定义转换成分布式执行的操作,以充分利用可以利用的计算资源(如CPU或GPU)。一般你不需要显式指定使用CPU还是GPU,Tensorflow能自动检测。如果检测到GPU,Tensorflow会尽可能地使用找到的第一个GPU来执行操作。

如果机器上有超过一个可用的GPU,除了第一个外的其他GPU是不参与计算的。为了让Tensorflow使用这些GPU,你必须将op明确地指派给它们执行。with...Device语句用来指派特定的CPU或GPU操作:

with tf.Session() as sess:
  with tf.device("/gpu:1"):
    matrix1 = tf.constant([[3., 3.]])
    matrix2 = tf.constant([[2.], [2.]])
    product = tf.matmul(matrix1, matrix2)
  • 1
  • 2
  • 3
  • 4
  • 5

设备用字符串进行标识,目前支持的设备包括:

  • /cpu:0:机器的CPU
  • /gpu:0:机器的第一个GPU,如果有的话
  • /gpu:1:机器的的第二个GPU,以此类推

交互式使用

文档中的python示例使用一个会话Session来启动图,并调用Session.run()方法执行操作。

为了便于使用诸如IPython之类的python交互环境,可以使用InteractiveSession代替Session类,使用Tensor.eval()Operation.run()方法代替Session.run()。这样可以避免使用一个变量来持有会话:

# 进入一个交互式Tensorflow会话
import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0]);

# 使用初始化器initializer op的run()方法初始化x
x.initializer.run()

# 增加一个减法sub op,从x减去a。运行减法op,输出结果
sud = tf.sub(x, a)
print sub.eval()
# ==>[-2. -1.]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Tensor

Tensorflow程序使用tensor数据结构来代表所有的数据,计算图中,操作间传递数据都是tensor。你可以把Tensorflowtensor看做是一个n维的数组或列表。一个tensor包含一个静态类型rank和一个shape

Tensorflow系统中,张量的维数被描述为阶。但是张量的阶和矩阵的阶并不是同一个概念。张量的阶是张量维数的一个数量描述,下面的张量(使用python中list定义的)就是2阶:

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • 1

你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量。对于一个二阶张量,你可以使用语句t[i, j]来访问其中的任何元素。而对于三阶张量你可以通过t[i, j, k]来访问任何元素:

数学实例 python例子
0 纯量(只有大小) s=483
1 向量(大小和方向) v=[1.1, 2.2, 3.3]
2 矩阵(数据表) m=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3 3阶张量 t=[[[2], [4], [6]], [[8], [9], [10]], [[11], [12], [13]]]
n n

形状

Tensorflow文档中使用了三种记号来方便地描述张量的维度:阶,形状以及维数。以下展示了它们之间的关系:

形状 维数 实例
0 [] 0-D 一个0维张量,一个纯量
1 [D0] 1-D 一个1维张量的形式[5]
2 [D0, D1] 2-D 一个2维张量的形式[3, 4]
3 [D0, D1, D2] 3-D 一个3维张量的形式[1, 4, 3]
n [D0, D1, ... Dn] n-D 一个n维张量的形式[D0, D1, ..., Dn]

数据类型

除了维度,tensor有一个数据类型属性。你可以为一个张量指定下列数据类型中的任意一个类型:

数据类型 python类型 描述
DT_FLOAT tf.float32 32位浮点数
DT_DOUBLE tf.float64 64位浮点数
DT_INT64 tf.int64 64位有符号整型
DT_INT32 tf.int32 32位有符号整型
DF_INT16 tf.int16 16位有符号整型
DT_INT8 tf.int8 8位有符号整型
DT_UINT8 tf.uint8 8位无符号整型
DT_STRING tf.string 可变长度的字节数组,每一个张量元素都是一个字节数组
DT_BOOL tf.bool 布尔型
DT_COMPLEX64 tf.complex64 由32位浮点数组成的负数:实数和虚数
DT_QINT32 tf.qint32 用于量化Ops的32位有符号整型
DT_QINT8 tf.qint8 用于量化Ops的8位有符号整型
DT_QUINT8 tf.quint8 用于量化Ops的8位无符号整型

变量

Variables 中查看更多细节。变量维护图执行过程中的状态信息。下面的例子演示了如何使用变量实现一个简单的计数器:

# 创建一个变量,初始为标量0
state = tf.Variable(0, name="counter")

# 创建一个op,其作用是使`state`增加1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# 启动图后,变量必须先经过init op初始化
# 首先先增加一个初始化op到图中
init_op = tf.initialize_all_variables()

# 启动图
with tf.Session() as sess:
  # 运行init op
  sess.run(init_op)
  # 打印 state 的初始值
  print sess.run(state)
  # 运行op, 更新state 并打印
  for _ in range(3):
    sess.run(update)
    print sess.run(state)

# 输出:
# 0
# 1
# 2
# 3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

代码中assign()操作是图所描述的表达式的一部分,正如add()操作一样,所以在调用run()执行表达式之前,它并不会真正执行赋值操作。

通常会将一个统计模型中的参数表示为一组变量。例如,你可以将一个神经网络的权重作为某个变量存储在一个tensor中。在训练过程中,通过反复训练图,更新这个tensor

Fetch

为了取回操作的输出内容,可以在使用Session对象的run()调用执行图时,传入一些tensor,这些tensor会帮助你取回结果。在之前的例子里,我们只取回了单个节点state,但是你也可以取回多个tensor:

input1 = tf.constant(3.0)
input2 = tf.constant(4.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print result

# print
# [27.0, 9.0]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

需要获得更多个tensor值,在op的依次运行中获得(而不是逐个去获得tenter)。

Feed

上述示例在计算图中引入tensor,以常量或变量的形式存储。Tensorflow还提供了feed机制,该机制可以临时替代图中的任意操作中的tensor可以对图中任何操作提交补丁,直接插入一个tensor

feed使用一个tensor值临时替换一个操作的输出结果,你可以提供feed数据作为run()调用的参数。feed只在调用它的方法内有效,方法结束,feed就会消失。最常见的用例是将某些特殊的操作指定为feed操作,标记的方法是使用tf.placeholder()为这些操作创建占位符。

input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)

with tf.Session() as see:
  print sess.run([output], feed_dict={input:[7.], input2:[2.]})

# print
# [array([ 14.], dtype=float32)]

Github上除了有TensorFlow的源码库之外,还有一些很不错的适合入门的资源。现在将目前已经接触到的资源整理出来,和大家分享。

1、TensorFlow源码库

https://github.com/tensorflow/tensorflow

2、TensorFlow中文文档

https://github.com/jikexueyuanwiki/tensorflow-zh

3、TensorFlow入门例子库1,每个例子都有对应的Notebook说明。

https://github.com/pkmital/tensorflow_tutorials

4、TensorFlow入门例子库2

https://github.com/nlintz/TensorFlow-Tutorials

5、TensorFlow入门例子库3,每个例子都有对应的Notebook说明。

https://github.com/aymericdamien/TensorFlow-Examples

TensorFlow学习课程:

http://learningtensorflow.com/index.html

这个网站按照入门的顺序,安排课程介绍如何学习TensorFlow,并且配备了一些例子和资料,很适合入门初学者学习。

正因为当初对未来做了太多的憧憬,所以对现在的自己尤其失望。生命中曾经有过的所有灿烂,终究都需要用寂寞来偿还。
原文地址:https://www.cnblogs.com/candlia/p/11920230.html