tf.get_variable:使用这些参数获取现有变量或创建一个新变量。
该函数的作用是创建新的tensorflow变量,常见的initializer有:
常量初始化器 : tf.constant_initializer、
正态分布初始化器 : tf.random_normal_initializer、
截断正态分布初始化器 : tf.truncated_normal_initializer、
均匀分布初始化器 : tf.random_uniform_initializer。
import tensorflow as tf;
import numpy as np;
# 常量初始化器
v1_cons = tf.get_variable('v1_cons', shape=[1, 4], initializer=tf.constant_initializer())
v2_cons = tf.get_variable('v2_cons', shape=[1, 4], initializer=tf.constant_initializer(9))
# 正态分布初始化器
v1_nor = tf.get_variable('v1_nor', shape=[1, 4], initializer=tf.random_normal_initializer())
v2_nor = tf.get_variable('v2_nor', shape=[1, 4],
initializer=tf.random_normal_initializer(mean=0, stddev=5, seed=0)) # 均值、方差、种子值
# 截断正态分布初始化器
v1_trun = tf.get_variable('v1_trun', shape=[1, 4], initializer=tf.truncated_normal_initializer())
v2_trun = tf.get_variable('v2_trun', shape=[1, 4],
initializer=tf.truncated_normal_initializer(mean=0, stddev=5, seed=0)) # 均值、方差、种子值
# 均匀分布初始化器
v1_uni = tf.get_variable('v1_uni', shape=[1, 4], initializer=tf.random_uniform_initializer())
v2_uni = tf.get_variable('v2_uni', shape=[1, 4],
initializer=tf.random_uniform_initializer(maxval=-1., minval=1., seed=0)) # 最大值、最小值、种子值
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("常量初始化器v1_cons:", sess.run(v1_cons))
print("常量初始化器v2_cons:", sess.run(v2_cons))
print("正态分布初始化器v1_nor:", sess.run(v1_nor))
print("正态分布初始化器v2_nor:", sess.run(v2_nor))
print("截断正态分布初始化器v1_trun:", sess.run(v1_trun))
print("截断正态分布初始化器v2_trun:", sess.run(v2_trun))
print("均匀分布初始化器v1_uni:", sess.run(v1_uni))
print("均匀分布初始化器v2_uni:", sess.run(v2_uni))
# 输出结果:
# 常量初始化器v1_cons: [[0. 0. 0. 0.]]
# 常量初始化器v2_cons: [[9. 9. 9. 9.]]
# 正态分布初始化器v1_nor: [[ 0.1405017 -1.0637658 -1.631958 -0.6858331]]
# 正态分布初始化器v2_nor: [[-1.9957879 10.522196 0.8553612 2.7325907]]
# 截断正态分布初始化器v1_trun: [[1.4671806 1.401085 1.3024487 0.8837652]]
# 截断正态分布初始化器v2_trun: [[-1.9957879 0.8553612 2.7325907 2.1127698]]
# 均匀分布初始化器v1_uni: [[0.7386234 0.36884522 0.658229 0.95516753]]
# 均匀分布初始化器v2_uni: [[ 0.79827476 -0.9403336 -0.69752836 0.9034374 ]]
tf.compat.v1.get_variable(
name,
shape=None,
dtype=None,
initializer=None,
regularizer=None,
trainable=None,
collections=None,
caching_device=None,
partitioner=None,
validate_shape=True,
use_resource=None,
custom_getter=None,
constraint=None,
synchronization=tf.VariableSynchronization.AUTO,
aggregation=tf.compat.v1.VariableAggregation.NONE
)
此函数在名称前加上当前变量作用域,并执行重用检查。有关重用的工作原理的详细说明,请参见“ 可变作用域”。这是一个基本示例:
import tensorflow as tf
def foo():
with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
v = tf.get_variable("v", [1])
return v
v1 = foo() # Creates v.
v2 = foo() # Gets the same, existing v.
assert v1 == v2
print(v1)
print(v2)
# 输出结果:
# <tf.Variable 'foo/v:0' shape=(1,) dtype=float32_ref>
# <tf.Variable 'foo/v:0' shape=(1,) dtype=float32_ref>
如果initializer
是None
(默认值),则将使用在变量范围中传递的默认initializer
。如果默认initializer
也是None
, 将使用一个glorot_uniform_initializer
。initializer
也可以是一个Tensor,在这种情况下,变量将初始化为该值和形状。
同样,如果regularizer
正则化器为None
(默认值),则将使用在变量范围中传递的默认regularizer
正则化器(如果默认regularizer
也是None
,则默认情况下不执行任何regularization
正则化)。
如果提供了partitioner
分区程序,则返回一个PartitionedVariable
。以一个Tensor
形式访问此对象将返回沿着分区轴串联的碎片。
一些有用的partitioners
可用。参见例如:variable_axis_size_partitioner
和min_max_variable_partitioner
。
Args |
|
---|---|
name |
新变量或现有变量的名称。 |
shape |
新变量或现有变量的形状。 |
dtype |
新变量或现有变量的类型(默认为DT_FLOAT )。 |
initializer |
变量的初始化(如果已创建)。可以是一个initializer 初始化对象或一个张量。如果它是张量,必须知道其形状,除非validate_shape为False,。 |
regularizer |
一个(Tensor-> Tensor或None)函数; 将其应用于新创建的变量的结果将添加到集合tf.GraphKeys.REGULARIZATION_LOSSES 中 ,并可用于正则化。 |
trainable |
如果为True, 也要将变量添加到图集合GraphKeys.TRAINABLE_VARIABLES 中 (请参阅参考资料tf.Variable )。 |
collections |
要添加变量的图集合键列表。默认为[GraphKeys.GLOBAL_VARIABLES] (请参阅 tf.Variable )。 |
caching_device |
可选设备字符串或函数,用于描述应将变量缓存在何处以进行读取。默认为变量的设备。如果不是None ,则在另一台设备上缓存。典型用途是在Ops使用变量驻留的设备上缓存,通过Switch和其他条件语句对副本进行重复数据删除。 |
partitioner |
可选的callable,它接受完全定义的要创建的Variable的TensorShape 和dtype ,并返回每个轴的partitions 列表(当前只能对一个轴进行分区)。 |
validate_shape |
如果为False,则允许使用未知形状的值初始化变量。如果为True(默认值),则必须知道initial_value的形状。为此,要被使用的initializer 必须是一个Tensor而不是一个initializer 对象。 |
use_resource |
如果为False,则创建一个常规变量。如果为true,则使用定义良好的语义创建实验性ResourceVariable。默认为False(以后将更改为True)。启用急切执行后,此参数始终被强制为True。 |
custom_getter |
Callable以真实的getter作为第一个参数,并允许覆盖内部的get_variable方法。custom_getter 的签名应与此方法的签名相匹配,但最适合将来的版本将允许进行更改:def custom_getter(getter, *args, **kwargs) 。也可以直接访问所有get_variable def 参数:custom_getter(getter, name, *args, **kwargs) 。一个简单的自定义标识getter ,它简单地创建具有修改名称的变量:
|
constraint |
由Optimizer 更新后将应用于变量的一个可选投影函数(例如,用于实现图层权重的范数约束或值约束)。该函数必须将代表变量值的未投影张量作为输入,并返回投影值的张量(必须具有相同的形状)。在进行异步分布式训练时,使用约束并不安全。 |
synchronization |
指示何时分布式变量将被聚合。接受的值是在tf.VariableSynchronization 类中定义的常量。默认情况下,synchronization 设置为 AUTO ,并且当前的DistributionStrategy 选择何时进行同步。 |
aggregation |
指示将如何聚合分布式变量。接受的值是在tf.VariableAggregation 类中定义的常量 。 |
Returns |
---|
创建的或现有的Variable (或PartitionedVariable ,如果使用了partitioner )。 |
Raises |
|
---|---|
ValueError |
当创建新变量且未声明shape时,在变量创建过程中违反重用时或initializer dtype 与dtype 不匹配时。重用设置在variable_scope 内部。 |