码迷,mamicode.com
首页 > 其他好文 > 详细

变量OP

时间:2020-07-11 09:59:35      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:ESS   val   ble   auto   没有   dev   效果   session   需要   

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

标签:ESS   val   ble   auto   没有   dev   效果   session   需要   

原文地址:https://www.cnblogs.com/yangjingshixinlingdechuanghu/p/13282168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!