Tensorflow入门基本概念

Tensorflow中最基本的几个概念:计算图(tf.Graph)、张量(tf.Tensor)、会话(tf.Session)和优化方法(Optimizer)。我将从这几个方面简单说一下我的理解,对于文中出现的任何错误或者不准确的地方,欢迎大家批评指正!

TensorFlow程序一般可分为两个阶段。第一阶段需要定义计算图中所有的计算,第二阶段为执行计算(会话部分)。

计算图:

计算图是TensorFlow的计算模型,所有TensorFlow的程序都会使用计算图的形式来进行表示。计算图上的每一个节点都是一个运算,而计算图上的边则表示了运算之间的数据传递关系。计算图上还保存了每个运算的设备信息(如是通过GPU上还是CPU上运行的)以及运算之间的依赖关系。计算图提供了管理不同集合的功能,并且TensorFlow会自动维护5个不同的默认集合。

张量:

张量是TensorFlow的数据模型,TensorFlow中所有运算的输入、输出都是张量。张量本身并不存储任何数据,它只是对运算结果的引用。通过张量,可以更好的组织TensorFlow程序。从功能的角度看,张量可以被简单理解为多维数组。其中零阶张量表示标量(scalar),也就是一个数;第一阶张量为向量(vector),也就是一维数组;第n阶张量可以理解为一个n维数组。但张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。张量中并没有保存实际数字,它保存的是如何得到这些数字的计算过程。

张量的使用可以分为两类:

  • 第一类用途是对中间计算结果的引用。当一个计算包含很多中间结果时,使用张量可以大大提高代码的可读性。以下为使用张量和不使用张量记录中间结果来完成向量相加的功能的代码对比。
#使用张量记录中间结果
a = tf.constant([1.0,2.0],name="a")
b = tf.constant([2.0,3.0],name="b")
result = tf.add(a,b,name="add")

#不适用张量记录中间结果
result = tf.constant([1.0,2.0],name="a") + tf.constant([2.0,3.0],name="b")

从上边的代码中可以看到,使用张量可以提高代码的可读性,a,b就是对常量生成这个计算结果的引用,这样在做加法是就可以直接使用这两个变量,而不需要再去生成这些常量。当计算复杂度增加时(比如构建深层神经网络),通过张量来引用计算的中间结果可以使代码的可阅读性大大提升。通过张量来存储中间结果可以方便获取中间结果。比如在卷积神经网络中,卷积层和池化层有可能改变张量的维度,通过result.get_shape函数来获取张量的维度信息,可以避免人工计算的麻烦。

  • 第二类情况使计算图构造完成后,张量可以用来获得计算结果,也就是得到真实的数字。虽然张量本身没有存储具体的数字,但可以通过会话,就可以得到这些具体的数字。 

会话:

会话是TensorFlow的运算模型,它管理了一个TensorFlow程序拥有的系统资源,所有的运算都是要通过会话执行的。所有计算完成后需要关闭会话来帮助系统回收资源,否则可能出现资源泄露的问题。会话模式一般有两种,如下所示:

#模式1
sess = tf.Session()
sess.run(...)
sess.close()

#模式2
with tf.Session() as sess:
    sess.run(...)

优化方法:

机器学习中训练或优化参数是重要的一环,在TensorFlow中有一个tf.train模块用来解决这个问题。我们常用的优化方法有:梯度下降(gradient descent)、Adam和Adagrad。下面介绍一些Optimizer实例类型:

Optimizer实例类型
实例类型 作用
tf.train.AdagradOptimizer 自适应梯度Optimizer,学习率随时间锐减
tf.train.AdadeltaOptimizer 学习率不再绝对随时间衰减
tf.train.MomentumOptimizer 实现Momentum优化算法
此外还有AdamOptimizer,FtrlOptimizer,RMSPropOptimizer

使用Optimizer类,总结为以下步骤 :

  1. 为需要优化的参数,创建一个Optimizer                                                                                                                                     opt = GradientDescentOptimizer(learning_rate= [learning rate])
  2. 创建一个操作,调用mimimize方法,最小化损失函数。                                                                                                            optimization_op = opt.minimize(cost,var_list=[variable list])                                                                                                      其中,minimize函数需要遵守以下的格式:
    tf.train.Optimizer.minimize(loss,global_step=None,var_list=None,gate_gradients=1,aggregation_method=None,colocate_gradients_with_ops = False,name=None)
    
    主要参数:
    loss:存放损失函数每轮迭代后的数值
    global_step:Optimizer执行一次迭代,加一
    var_list:需要优化的变量

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章