变量OP

Posted yangjingshixinlingdechuanghu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变量OP相关的知识,希望对你有一定的参考价值。

1.特点

  • 存储持久化
  • 可修改值
  • 可指定被训练

2.创建变量

  

  tf.Variable(initial_value=None,trainable=True,collections=None,name=None)

    • initial_value:初始化的值
    • trainable:是否被训练
    • 执行此函数时,变量不会与某一个张量绑定,因此需要给变量初始化tf.global_variables_initializer()
1 var = tf.Variable(tf.random.normal([2, 2], mean=0.0, stddev=1.0), name="var", trainable=True)
2 
3 with  tf.compat.v1.Session() as sess:
4     sess.run(tf.compat.v1.global_variables_initializer())#变量初始化要运行在see.run(var)之前
5     print(sess.run(var))

 运行结果

[[-2.2599807 0.39293766]
[ 0.02441685 -0.01926336]]

3.变量OP方法

  • new_var = assign(value)
    • 给变量赋值一个新的值
  • new_var  = assign_add(delta)
    • 对应位置相加的和赋值给变量
    •  1 var = tf.Variable(tf.random.normal([2, 2], mean=0.0, stddev=1.0), name="var", trainable=True)
       2 var1 = var.assign([[2, 3], [4, 5]])
       3 va = var.assign_add([[1, 3], [4, 5]])
       4 
       5 
       6 with  tf.compat.v1.Session() as sess:
       7 
       8     sess.run(tf.global_variables_initializer())  # 变量初始化要运行在see.run(var)之前
       9     print(sess.run(var))
      10     print(sess.run(var1))
      11     print(sess.run(var))
      12 
      13     print(sess.run(va))
      14     print(sess.run(var))

      运行结果

 

 1 [[-0.2968463   0.9496584 ]
 2  [ 0.09663372 -1.3511295 ]]
 3 [[2. 3.]
 4  [4. 5.]]
 5 [[2. 3.]
 6  [4. 5.]]
 7 [[ 3.  6.]
 8  [ 8. 10.]]
 9 [[ 3.  6.]
10  [ 8. 10.]]

4.命名空间与共享变量 

      共享变量的主要用途在一些网络当中的参数共享, 由于在TensorFlow当中,只要我们定义的OP,name参数指定一样,其实并不是同一个变量。如果想要达到重复利用变量的效果,我们就要使用tf.variable_scope()结合tf.get_variable()一起使用。

  • 定义一个相同名字的变量
1 var = tf.Variable(name=var, initial_value=[4], dtype=tf.float32)
2 var_double = tf.Variable(name=var, initial_value=[4], dtype=tf.float32)
 
 <tf.Variable var:0 shape=() dtype=float32_ref>
 <tf.Variable var_1:0 shape=() dtype=float32_ref>
  • 使用tf.variable_scope()修改OP命名空间

会在OP的名字前面增加命名空间的指定名字

1 with tf.variable_scope("name"):
2     var = tf.Variable(name=var, initial_value=[4], dtype=tf.float32)
3     var_double = tf.Variable(name=var, initial_value=[4], dtype=tf.float32)
4 
5 <tf.Variable name/var:0 shape=() dtype=float32_ref>
6 <tf.Variable name/var_1:0 shape=() dtype=float32_ref>
  • tf.get_variable共享变量
  •  1 import tensorflow as tf
     2 #
     3 #
     4 with tf.compat.v1.variable_scope("name", reuse=tf.compat.v1.AUTO_REUSE):#tf.AUTO_REUSE表示get_variable有就直接用,没有就创建
     5 
     6     var = tf.Variable(initial_value=tf.random.normal([2], mean=0.0, stddev=1.0),
     7                       name="var", dtype=tf.float32)
     8 
     9     var_double = tf.compat.v1.get_variable(initializer=tf.random.normal([1], mean=0.0, stddev=1.0),
    10                            name="var",
    11                            dtype=tf.float32)
    12     var1 = tf.compat.v1.get_variable(initializer=tf.random.normal([2, 2], mean=0.0, stddev=1.0),
    13                            name="var1",
    14                            dtype=tf.float32)
    15     var1_double = tf.compat.v1.get_variable(initializer=tf.random.normal([2, 2], mean=0.0, stddev=1.0),
    16                            name="var1",
    17                            dtype=tf.float32)
    18 
    19 
    20 with  tf.compat.v1.Session() as sess:
    21 
    22     sess.run(tf.compat.v1.global_variables_initializer())  # 变量初始化要运行在see.run(var)之前
    23     print(var)
    24     print(var_double)
    25     print(var1)
    26     print(var1_double)

     

运行结果

  • 1 <tf.Variable name/var:0 shape=(2,) dtype=float32_ref>
    2 <tf.Variable name/var_1:0 shape=(1,) dtype=float32_ref>
    3 <tf.Variable name/var1:0 shape=(2, 2) dtype=float32_ref>
    4 <tf.Variable name/var1:0 shape=(2, 2) dtype=float32_ref>

     

注意:

tf.get_variable()不会与tf.variable()共享变量,例如var与var_double

 

tf.variable() 和tf.get_variable()有不同的创建变量的方式:tf.Variable() 每次都会新建变量。如果希望重用(共享)一些变量,就需要用到了get_variable()它会去搜索变量名,有就直接用,没有再新建。此外,为了对不同位置或者范围的共享进行区分,就引入名字域。既然用到变量名了,就涉及到了名字域的概念。这就是为什么会有scope 的概念。name_scope 作用域操作,variable_scope 可以通过设置reuse 标志以及初始化方式来影响域下的变量,因为想要达到变量共享的效果, 就要在 tf.variable_scope()的作用域下使用 tf.get_variable() 这种方式产生和提取变量。

 

 

 

以上是关于变量OP的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Android片段管理器传递变量[重复]

TensorFlow变量OP

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

变量OP

使用片段时 Intellij 无法正确识别 Thymeleaf 模型变量

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段