请选择 进入手机版 | 继续访问电脑版
查看: 1423|回复: 0

tf.Variable()

[复制链接]

665

主题

1234

帖子

6557

积分

xdtech

Rank: 5Rank: 5

积分
6557
发表于 2019-9-18 14:37:25 | 显示全部楼层 |阅读模式
(1)参数说明

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

Args参数说明:

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:可选字符串。要添加到变量的名称范围。仅在从协议缓冲区初始化时使用。

(2)使用tf.Variable定义变量常用的两种方式

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

1、用固定的值初始化变量

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

2、用tf的初始化器初始化变量

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

用tf的初始化器initializer op初始化变量必须指定变量shape,用name指定名称

注意:这里只是定义了变量的初始化方式,并没有进行变量初始化。要在sess中执行初始化操作。

(3)执行变量初始化的三种方式

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

1、在回话中运行initializer 操作

tf.global_variable_initializer().run()
2、从文件中恢复,如restore from checkpoint

saver = tf.train.Saver()
with tf.Session() as sess:
    ckpt = tf.train.get_checkpoint_state(checkpoint_path)
    if ckpt and ckpt.model_checkpoint_path:
        saver.restore(sess,ckpt.model_checkpoint_path)
    else:
        print('No checkpoint file found')
变量初始化方式1、2也就是在模型训练和测试中常用的两种方式,在模型训练时,需要随机给模型赋初值,使用tf.global_variable_initializer().run()去初始化变量,在模型测试(或者进行fine-tune)时,使用初始化方式2从保存的ckpt中初始化变量。

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()


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表