TensorFlow--tf.get_variable
2018-01-13 21:27
393 查看
tf.get_variable(name, shape, initializer): name就是变量的名称,shape是变量的维度,initializer是变量初始化的方式,初始化的方式有以下几种:
tf.constant_initializer:常量初始化函数
tf.random_normal_initializer:正态分布
tf.truncated_normal_initializer:截取的正态分布
tf.random_uniform_initializer:均匀分布
tf.zeros_initializer:全部是0
tf.ones_initializer:全是1
tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值
例如:
[python] view
plain copy
import tensorflow as tf;
import numpy as np;
import matplotlib.pyplot as plt;
a1 = tf.get_variable(name='a1', shape=[2,3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
a2 = tf.get_variable(name='a2', shape=[1], initializer=tf.constant_initializer(1))
a3 = tf.get_variable(name='a3', shape=[2,3], initializer=tf.ones_initializer())
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print sess.run(a1)
print sess.run(a2)
print sess.run(a3)
输出:
[[ 0.42299312 -0.25459203 -0.88605702]
[ 0.22410156 1.34326422 -0.39722782]]
[ 1.]
[[ 1. 1. 1.]
[ 1. 1. 1.]]
注意:不同的变量之间不能有相同的名字,除非你定义了variable_scope,这样才可以有相同的名字。
一、tf.Variable(),tf.get_variable()的作用与区别:
tf.Variable()和tf.get_variable()都是用于在一个name_scope下面获取或创建一个变量的两种方式,区别在于:
tf.Variable()会自动检测命名冲突并自行处理,但tf.get_variable()则遇到重名的变量创建且变量名没有设置为共享变量时,则会报错。
tf.Variable()用于创建一个新变量,在同一个name_scope下面,可以创建相同名字的变量,底层实现会自动引入别名机制,两次调用产生了其实是两个不同的变量。
tf.get_variable()用于获取一个变量,并且不受name_scope的约束。当这个变量已经存在时,则自动获取;如果不存在,则自动创建一个变量。
二、tf.name_scope()与tf.variable_scope()的作用与区别:
tf.name_scope():主要用于管理一个图里面的各种op,返回的是一个以scope_name命名的context manager。一个graph会维护一个name_space的
堆,每一个namespace下面可以定义各种op或者子namespace,实现一种层次化有条理的管理,避免各个op之间命名冲突。
tf.variable_scope():一般与tf.name_scope()配合使用,用于管理一个graph中变量的名字,避免变量之间的命名冲突,tf.variable_scope()允许在一个variable_scope下面共享变量。
代码示例:
在 tf.name_scope下时,tf.get_variable()创建的变量名不受 name_scope 的影响,而且在未指定共享变量时,如果重名会报错,tf.Variable()会自动检测有没有变量重名,如果有则会自行处理。
如果使用tf.get_variable()创建变量,且没有设置共享变量,重名时会报错
所以要共享变量,需要使用tf.variable_scope()
tf.constant_initializer:常量初始化函数
tf.random_normal_initializer:正态分布
tf.truncated_normal_initializer:截取的正态分布
tf.random_uniform_initializer:均匀分布
tf.zeros_initializer:全部是0
tf.ones_initializer:全是1
tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值
例如:
[python] view
plain copy
import tensorflow as tf;
import numpy as np;
import matplotlib.pyplot as plt;
a1 = tf.get_variable(name='a1', shape=[2,3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
a2 = tf.get_variable(name='a2', shape=[1], initializer=tf.constant_initializer(1))
a3 = tf.get_variable(name='a3', shape=[2,3], initializer=tf.ones_initializer())
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print sess.run(a1)
print sess.run(a2)
print sess.run(a3)
输出:
[[ 0.42299312 -0.25459203 -0.88605702]
[ 0.22410156 1.34326422 -0.39722782]]
[ 1.]
[[ 1. 1. 1.]
[ 1. 1. 1.]]
注意:不同的变量之间不能有相同的名字,除非你定义了variable_scope,这样才可以有相同的名字。
一、tf.Variable(),tf.get_variable()的作用与区别:
tf.Variable()和tf.get_variable()都是用于在一个name_scope下面获取或创建一个变量的两种方式,区别在于:
tf.Variable()会自动检测命名冲突并自行处理,但tf.get_variable()则遇到重名的变量创建且变量名没有设置为共享变量时,则会报错。
tf.Variable()用于创建一个新变量,在同一个name_scope下面,可以创建相同名字的变量,底层实现会自动引入别名机制,两次调用产生了其实是两个不同的变量。
tf.get_variable()用于获取一个变量,并且不受name_scope的约束。当这个变量已经存在时,则自动获取;如果不存在,则自动创建一个变量。
二、tf.name_scope()与tf.variable_scope()的作用与区别:
tf.name_scope():主要用于管理一个图里面的各种op,返回的是一个以scope_name命名的context manager。一个graph会维护一个name_space的
堆,每一个namespace下面可以定义各种op或者子namespace,实现一种层次化有条理的管理,避免各个op之间命名冲突。
tf.variable_scope():一般与tf.name_scope()配合使用,用于管理一个graph中变量的名字,避免变量之间的命名冲突,tf.variable_scope()允许在一个variable_scope下面共享变量。
代码示例:
在 tf.name_scope下时,tf.get_variable()创建的变量名不受 name_scope 的影响,而且在未指定共享变量时,如果重名会报错,tf.Variable()会自动检测有没有变量重名,如果有则会自行处理。
import tensorflow as tf with tf.name_scope('name_scope_x'): var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32) var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32) var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(var1.name, sess.run(var1)) print(var3.name, sess.run(var3)) print(var4.name, sess.run(var4)) # 输出结果: # var1:0 [-0.30036557] 可以看到前面不含有指定的'name_scope_x' # name_scope_x/var2:0 [ 2.] # name_scope_x/var2_1:0 [ 2.] 可以看到变量名自行变成了'var2_1',避免了和'var2'冲突
如果使用tf.get_variable()创建变量,且没有设置共享变量,重名时会报错
import tensorflow as tf with tf.name_scope('name_scope_1'): var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32) var2 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(var1.name, sess.run(var1)) print(var2.name, sess.run(var2)) # ValueError: Variable var1 already exists, disallowed. Did you mean # to set reuse=True in VarScope? Originally defined at: # var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
所以要共享变量,需要使用tf.variable_scope()
import tensorflow as tf with tf.variable_scope('variable_scope_y') as scope: var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32) scope.reuse_variables() # 设置共享变量 var1_reuse = tf.get_variable(name='var1') var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32) var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(var1.name, sess.run(var1)) print(var1_reuse.name, sess.run(var1_reuse)) print(var2.name, sess.run(var2)) print(var2_reuse.name, sess.run(var2_reuse)) # 输出结果: # variable_scope_y/var1:0 [-1.59682846] # variable_scope_y/var1:0 [-1.59682846] 可以看到变量var1_reuse重复使用了var1 # variable_scope_y/var2:0 [ 2.] # variable_scope_y/var2_1:0 [ 2.]
相关文章推荐
- TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
- tensorflow的共享变量,tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()联系与区别:
- tensorflow的共享变量,tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()联系与区别
- TensorFlow学习--tf.get_variable使用
- tensorflow的共享变量,tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()联系与区别
- tensorflow学习笔记--tf.get_variable、tf.Variable
- tensorflow 变量生成 变量管理 tf.Variable & tf.get_variable & tf.variable_scope
- TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
- tensorflow中使用tf.variable_scope和tf.get_variable的ValueError
- [Tensorflow]Sharing Variables 共享权值【tf.get_variable 和 tf.variable_scope】
- Tensorflow中tf.get_variable和tf.variable_scope的使用
- tensorflow共享变量, tf.get_variable() 和 tf.Varibele()的区别
- 简单Tensorflow线性拟合类及tf.get_variable()使用示例
- 【tensorflow 学习】tf.get_variable()和tf.Variable()的区别
- 【tensorflow】scope的使用以及tf.Variable()和tf.get_variable()的区别
- tf.get_variable()
- tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
- tf.get_variable 和tf.variable_scope
- tf.get_variable tf.variable_scope tf.name_scope
- tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()