您的位置:首页 > 其它

7、Tensorflow tf.Variable与tf.get_variable

2019-02-27 19:37 197 查看

tf.Variable() 和tf.get_variable()的区别:tf.Variable() 每次调用都会产生一个新的变量,他会自动检测命名冲突并自行处理,变量名称是一个可选参数,例如:

a1 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='a1')
a2 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='a1')

print(a1.name)

print(a2.name)

print(a1==a2)

运行结果:

f1/a1:0
f1/a1_1:0

False    # a2实际变成了a1_1并且和a1 不是同一个变量

而tf.get_variable()则不同,遇到重命名的变量创建且变量名没有设置成共享变量(所谓的共享是指在同一参数空间下的共享,参数空间名称不一样就不能共享了)时,就会报错 ;相对应的,变量名称这个参数是必填参数,tf.get_variable()会根据这个参数去创建或者获取变量。

1、tf.Variable

1.1、参数

tf.Variable是一个Variable类通过变量维持图graph的状态,以便在sess.run()中执行;可以用Variable类创建一个实例在图中增加变量

函数主要参数有:

initial_value:Tensor或可转换为Tensor的Python对象,它是Variable的初始值。除非validate_shape设置为False,否则初始值必须具有指定的形状。也可以是一个可调用的,没有参数,在调用时返回初始值。在这种情况下,必须指定dtype。 (请注意,init_ops.py中的初始化函数必须首先绑定到形状才能在此处使用。)

trainable:如果为True,则会默认将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES中。此集合用于优化器Optimizer类优化的的默认变量列表【可为optimizer指定其他的变量集合】,可就是要训练的变量列表。
collections:一个图graph集合列表的关键字。新变量将添加到这个集合中。默认为[GraphKeys.GLOBAL_VARIABLES]。也可自己指定其他的集合列表;
validate_shape:如果为False,则允许使用未知形状的值初始化变量。如果为True,则默认为initial_value的形状必须已知。
caching_device:可选设备字符串,描述应该缓存变量以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。

name:变量的可选名称。默认为“Variable”并自动获取。

variable_def:VariableDef协议缓冲区。如果不是None,则使用其内容重新创建Variable对象,引用图中必须已存在的变量节点。图表未更改。 variable_def和其他参数是互斥的。

 dtype:如果设置,则initial_value将转换为给定类型。如果为None,则保留数据类型(如果initial_value是Tensor),或者convert_to_tensor将决定。

 expected_shape:TensorShape。如果设置,则initial_value应具有此形状。

import_scope:可选字符串。要添加到变量的名称范围。仅在从协议缓冲区初始化时使用。

一般常用的参数包括初始化值和名称name(是该变量的唯一索引):

 w = tf.Variable(<initial-value>,name=<optional-name>)

w = tf.Variable(tf.truncated_normal([3,4],mean=0,stddev=.5),name='weight')

用initializer op初始化变量必须指定变量shape,且设置名称weight时必须要用name指定

1.2、初始化

在使用变量之前必须要进行初始化,初始化的方式有三种:

(1)在回话中运行initializer 操作
tf.global_variable_initializer().run()

(2)从文件中恢复,如restore from checkpoint
ckpt = tf.train.get_checkpoint_state(checkpoint_path)

if ckpt and ckpt.model_checkpoint_path:

 saver.restore(sess,ckpt.model_checkpoint_path)

(3)也可自己通过tf.assign()给变量附初值,
实际上用initializer初始化方法给变量赋初值就是调用tf.assign()将变量的值赋给变量,可以自己调用tf.assign()给变量赋初值;
 

a = tf.Variable(1.0)
a = tf.assign(a,5.0)
b = tf.Variable(2.0)
b = tf.assign(b,6.0)
c = a+b
with tf.Session() as sess:
#相当于调用tf.assign()给变量赋初值
    sess.run([a,b])
    print(c.eval())


2  tf.get_variable


获取一个已经存在的变量或者创建一个新的变量

get_variable(
    name,
    shape=None,
    dtype=None,
    initializer=None,
    regularizer=None,
    trainable=True,
    collections=None,
    caching_device=None,
    partitioner=None,
    validate_shape=True,
    use_resource=None,
    custom_getter=None,
    constraint=None
)

参数:

    name:新变量或现有变量的名称。
    shape:新变量或现有变量的形状。
    dtype:新变量或现有变量的类型(默认为DT_FLOAT)。
    ininializer:如果创建了则用它来初始化变量。
    regularizer:A(Tensor - > Tensor或None)函数;将它应用于新创建的变量的结果将添加到集合          tf.GraphKeys.REGULARIZATION_LOSSES中,并可用于正则化。
    trainable:如果为True,还将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES(参见tf.Variable)。
    collections:要将变量添加到的图表集合列表。默认为[GraphKeys.GLOBAL_VARIABLES](参见tf.Variable)。
    caching_device:可选的设备字符串或函数,描述变量应被缓存以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。
    partitioner:可选callable,接受完全定义的TensorShape和要创建的Variable的dtype,并返回每个轴的分区列表(当前只能对一个轴进行分区)。
    validate_shape:如果为False,则允许使用未知形状的值初始化变量。如果为True,则默认为initial_value的形状必须已知。
    use_resource:如果为False,则创建常规变量。如果为true,则使用定义良好的语义创建实验性ResourceVariable。默认为False(稍后将更改为True)。在Eager模式下,此参数始终强制为True。
    custom_getter:Callable,它将第一个参数作为true getter,并允许覆盖内部get_variable方法。 custom_getter的签名应与此方法的签名相匹配,但最适合未来的版本将允许更改:def custom_getter(getter,* args,** kwargs)。也允许直接访问所有get_variable参数:def custom_getter(getter,name,* args,** kwargs)。一个简单的身份自定义getter只需创建具有修改名称的变量是:python def custom_getter(getter,name,* args,** kwargs):return getter(name +'_suffix',* args,** kwargs)
如果initializer初始化方法是None(默认值),则会使用variable_scope()中定义的initializer,如果也为None,则默认使用glorot_uniform_initializer,也可以使用其他的tensor来初始化,value,和shape与此tensor相同

正则化方法默认是None,如果不指定,只会使用variable_scope()中的正则化方式,如果也为None,则不使用正则化;

附: tf.truncated_narmal()和tf.truncated_naomal__initializer()的区别

tf.truncated_narmal(shape=[],mean=0,stddev=0.5)使用时必须制定shape,返回值是在截断的正态分布随机生成的指定shape的tensor
tf.truncated_normal_initializer(mean=0.stddev=0.5)调用返回一个initializer 类的一个实例(就是一个初始化器),不可指定shape,
--------------------- 
原文:https://blog.csdn.net/MrR1ght/article/details/81228087 
 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: