tf.get_variable用法

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>

如果initializerNone(默认值),则将使用在变量范围中传递的默认initializer。如果默认initializer也是None, 将使用一个glorot_uniform_initializerinitializer也可以是一个Tensor,在这种情况下,变量将初始化为该值和形状。

同样,如果regularizer正则化器为None(默认值),则将使用在变量范围中传递的默认regularizer正则化器(如果默认regularizer也是None,则默认情况下不执行任何regularization正则化)。

如果提供了partitioner分区程序,则返回一个PartitionedVariable。以一个Tensor形式访问此对象将返回沿着分区轴串联的碎片。

一些有用的partitioners可用。参见例如:variable_axis_size_partitionermin_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_variabledef参数:custom_getter(getter, name, *args, **kwargs) 。一个简单的自定义标识getter,它简单地创建具有修改名称的变量:

 

def custom_getter(getter, name, *args, **kwargs):
    return getter(name + '_suffix', *args, **kwargs)
 
constraint Optimizer更新后将应用于变量的一个可选投影函数(例如,用于实现图层权重的范数约束或值约束)。该函数必须将代表变量值的未投影张量作为输入,并返回投影值的张量(必须具有相同的形状)。在进行异步分布式训练时,使用约束并不安全。
synchronization 指示何时分布式变量将被聚合。接受的值是在tf.VariableSynchronization类中定义的常量。默认情况下,synchronization设置为 AUTO,并且当前的DistributionStrategy选择何时进行同步。
aggregation 指示将如何聚合分布式变量。接受的值是在tf.VariableAggregation类中定义的常量 。

Returns

创建的或现有的Variable(或PartitionedVariable,如果使用了partitioner)。

Raises

ValueError 当创建新变量且未声明shape时,在变量创建过程中违反重用时或initializer dtypedtype不匹配时。重用设置在variable_scope内部。 

猜你喜欢

转载自blog.csdn.net/qq_36201400/article/details/108499982
今日推荐