使用前面两节已介绍的相关TensorFlow相关知识点,实现以下三个功能(变量更新)
- 实现一个累加器,并且每一步均输出累加器的结果值。
- 编写一段代码,实现动态的更新变量的维度数目
- 实现一个求解阶乘的代码
TensorFlow案例一
TensorFlow控制依赖
我们可以通过Variable和assign完成变量的定义和更新,但是如果在更新变量之前需要更新其它变量,那么会导致一个比较严重的问题:也就是需要多次调用sess.run方法来进行变量的更新。通过这种方式,代码复杂程度上升,同时也没有执行效率。
解决该问题的方案就是:控制依赖。通过TensorFlow中提供的一组函数来处理不完全依赖的情况下的操作排序问题(即给定哪个操作先执行的问题), 通过tf.control_dependencies API完成。
TensorFlow设备
设备是指一块可以用来运算并且拥有自己的地址空间的硬件,如CPU和GPU。
Tensorflow为了在执行操作的时候,充分利用计算资源,可以明确指定操作在哪个设备上执行。
一般情况下,不需要显示指定使用CPU还是GPU,TensorFlow会自动检测。如果检测到GPU,TensorFlow会尽可能地利用第一个GPU来执行操作。注意:如果机器上有超过一个可用的GPU,那么除了第一个外其它GPU默认是不参与计算的。所以,在实际TensorFlow编程中,经常需要明确给定使用的CPU和GPU。
“/cpu:0”:表示使用机器CPU运算
“/gpu:0”:表示使用第一个GPU运算,如果有的话
“/gpu:1”:表示使用第二个GPU运算,以此类推
TensorFlow变量作用域
通过tf.Variable我们可以创建变量,但是当模型复杂的时候,需要构建大量的变量集,这样会导致我们对于变量管理的复杂性,而且没法共享变量(存在多个相似的变量)。针对这个问题,可以通过TensorFlow提供的变量作用域机制来解决,在构建一个图的时候,就可以非常容易的使用共享命名过的变量。
Tensorflow中有两个作用域,一个是name_scope,另一个是variable_scope。
变量作用域机制在TensorFlow中主要通过两部分组成:tf.get_variable:通过所给定的名字创建或者返回一个对应的变量tf.variable_scope:为通过创建的变量或者操作Operation指定命名空间。
使用TensorFlow的变量作用域,体现简化变量数量的案例代码
tf.get_variable方法在调用的时候,主要需要给定参数名称name,形状shape,数据类型dtype以及初始化方式initializer四个参数。该API底层执行的时候,根据variable score的属性reuse的值决定采用何种方式来获取变量。当reuse值为False的时候(不允许设置),作用域就是创建新变量设置的,此时要求对应的变量不存在,否则报错;当reuse值为True的时候,作用域就是为重用变量所设置的,此时要求对应的变量必须存在,否则报错。当reuse的值为tf.AUTO_REUSE的时候,表示如果变量存在就重用变量,如果变量不存在,就创建新变量返回。(备注:reuse一般设置在variable score对象上)
TF底层使用’变量作用域/变量名称:0’的方式标志变量(eg: func/op1/weight:0)。TensorFlow中的name_score和variable_score是两个不同的东西,name_score的主要作用是为op_name前加前缀,variable_score是为get_variable创建的变量的名字加前缀。简单来讲:使用tf.Variable创建的变量受name_score和variable_score的的效果,会给变量添加前缀,但是使用tf.get_variable创建变量只受variable_score的效果。
name_score的主要作用就是:Tensorflow中常常会有数以千计的节点,在可视化的过程中很难一下子展示出来,因此用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级。name_scope会影响op_name,不会影响用get_variable()创建的变量,而会影响通过Variable()创建的变量。
注意:variable_score内部会创建一个同名的name_score