tensorflow语法【shape、tf.trainable_variables()、Optimizer.minimize()】

2022-12-01 16:35:29 浏览数 (1)

相关文章:

【一】tensorflow安装、常用python镜像源、tensorflow 深度学习强化学习教学

【二】tensorflow调试报错、tensorflow 深度学习强化学习教学

【三】tensorboard安装、使用教学以及遇到的问题

【四】超级快速pytorch安装


trick1---实现tensorflow和pytorch迁移环境教学

  • 张量shape参数理解

shape参数的个数应为维度数,每一个参数的值代表该维度上的长度

代码语言:javascript复制
shape=(100,784)	
代表该张量有两个维度,第一个维度长度为100,第二个维度长度为784,二维数组100行784列
shape=(2,) 
代表该张量有一个维度,第一个维度长度为2,一维数组1行2列

第几个维度的长度,就是左数第几个中括号组之间的元素总数量

代码语言:javascript复制
# 例:
[[[1,2,3],[4,5,6]]]
# 第一个维度中只有一个元素[[1,2,3][4,5,6]],所以第一个维度长度为1
# 第二个维度中有两个元素[1,2,3][4,5,6],所以第二个维度长度为2
# 第三个维度中有三个元素“1,2,3”或“4,5,6”,所以第三个维度长度为3
# 那么它的shape参数就是[1,2,3]
 

  • tf.trainable_variables(), tf.global_variables()的使用

tf.trainable_variables():

这个函数可以查看可训练的变量,参数trainable,其默认为True

代码语言:javascript复制
__init__(
    initial_value=None,
    trainable=True,
    collections=None,
    validate_shape=True,
   ...
)

对于一些我们不需要训练的变量,将trainable设置为False,这时tf.trainable_variables() 就不会打印这些变量。

举个简单的例子,在下图中共定义了4个变量,分别是一个权重矩阵,一个偏置向量,一个学习率和计步器,其中前两项是需要训练的而后两项则不需要。

代码语言:javascript复制
w1 = tf. Variable (tf. randon_normal ([256, 2000]),'w1' )
b1 = tf.get_ variable('b1', [2000])
learning_ rate = tf. Variable(0.5, trainable=False)
global_ step = tf. Variable(0, trainable=False)
代码语言:javascript复制
trainable_ params = tf. trainable_ variables()
trainable_ params
[<tf. Variable’Variable:0' shape= (256,2000) dtype=float32_ ref>,
<tf. Variable’ b1:0”shape= (2000,) dtype=float32_ ref>]

另一个问题就是,如果变量定义在scope域中,是否会有不同。实际上,tf.trainable_variables()是可以通过参数选定域名的,如下图所示:

代码语言:javascript复制
vith tf. variable_ scope(' var' ):
w2 = tf.get. variable('w2' , [3, 3])
w3 = tf.get. variable(' w3',[3, 3])

我们重新声明了两个新变量,其中w2是在‘var’中的,如果我们直接使用tf.trainable_variables(),结果如下

代码语言:javascript复制
trainable. params = tf.trainable.variables ()
trainable_ params
[<tf. Variable’ vrar/w2:0’shape=(3, 3) dtype=float32_ ref>,
<tf. Variable’w3:0' shape=(3, 3) dtype=float32_ ref>]

如果我们只希望查看‘var’域中的变量,我们可以通过加入scope参数的方式实现:

代码语言:javascript复制
scope_ parans = tf. trainable_ variables (scope-' var' )
scope par ains
[<tf. Variable ’var/w2:0' shape=(3, 3) dtype=float32_ ref>]

tf.global_variables()

如果我希望查看全部变量,包括我的学习率等信息,可以通过tf.global_variables()来实现。效果如下:

代码语言:javascript复制
global parans = tf. global variables()
global_ params
[<tf. Variable,Variable:0' shape=(256, 2000) dtype=float32_ ref>,
<tf. Variable ' b1:0' shape= (2000,) dtype-float32_ ref>,
<tf. Variable。Variable_ 1:0’shape=0 dtype=float32_ ref>,
<tf. Variable' Variable_ 2:0’ shape=() dtype=int32_ ref>]

这时候打印出来了4个变量,其中后两个即为trainable=False的学习率和计步器。与tf.trainable_variables()一样,tf.global_variables()也可以通过scope的参数来选定域中的变量。

  • Optimizer.minimize()与Optimizer.compute_gradients()和Optimizer.apply_gradients()的用法

Optimizer.minimize()

minimize()就是compute_gradients()和apply_gradients()这两个方法的简单组合,minimize()的源码如下:

代码语言:javascript复制
  def minimize(self, loss, global_step=None, var_list=None,
               gate_gradients=GATE_OP, aggregation_method=None,
               colocate_gradients_with_ops=False, name=None,
               grad_loss=None):
    grads_and_vars = self.compute_gradients(
        loss, var_list=var_list, gate_gradients=gate_gradients,
        aggregation_method=aggregation_method,
        colocate_gradients_with_ops=colocate_gradients_with_ops,
        grad_loss=grad_loss)
 
    vars_with_grad = [v for g, v in grads_and_vars if g is not None]
    if not vars_with_grad:
      raise ValueError(
          "No gradients provided for any variable, check your graph for ops"
          " that do not support gradients, between variables %s and loss %s." %
          ([str(v) for _, v in grads_and_vars], loss))
 
    return self.apply_gradients(grads_and_vars, global_step=global_step,
                                name=name)

主要的参数说明:

      loss:  Tensor ,需要优化的损失; 

      var_list: 需要更新的变量(tf.Varialble)组成的列表或者元组,默认值为GraphKeys.TRAINABLE_VARIABLES,即tf.trainable_variables()

注意:

1、Optimizer.minimize(loss, var_list)中,计算loss所涉及的变量(假设为var(loss))包含在var_list中,也就是var_list中含有多余的变量,并不 影响程序的运行,而且优化过程中不改变var_list里多出变量的值;

2、若var_list中的变量个数少于var(loss),则优化过程中只会更新var_list中的那些变量的值,var(loss)里多出的变量值 并不会改变,相当于固定了网络的某一部分的参数值。

compute_gradients()和apply_gradients()

代码语言:javascript复制
compute_gradients(self, loss, var_list=None,
                  gate_gradients=GATE_OP,
                  aggregation_method=None,
                  colocate_gradients_with_ops=False,
                  grad_loss=None):

里面参数的定义与minimizer()函数里面的一致,var_list的默认值也一样。需要特殊说明的是,如果var_list里所包含的变量多于var(loss),则程序会报错。其返回值是(gradient, variable)对所组成的列表,返回的数据格式也都是“tf.Tensor”。我们可以通过变量名称的管理来过滤出里面的部分变量,以及对应的梯度。

apply_gradients()的源码如下:

代码语言:javascript复制
apply_gradients(self, grads_and_vars, global_step=None, name=None)

grads_and_vars的格式就是compute_gradients()所返回的(gradient, variable)对,当然数据类型也是“tf.Tensor”,作用是,更新grads_and_vars中variable的梯度,不在里面的变量的梯度不变。

0 人点赞