变量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的主要内容,如果未能解决你的问题,请参考以下文章
append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]
使用片段时 Intellij 无法正确识别 Thymeleaf 模型变量
C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段