Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

Tensorflow基础学习Variable

$
0
0
作者: Sam (甄峰)   sam_code@hotmail.com

1. Variable基础:
1.1: Variable class:
Variable是Tensorflow中常用的class。 它在graph中,透过调用run()来维护状态。可以调用class Variable的构造函数创建一个实例,则这个variable被添加到graph中。

Variable() 构造函数需要一个initial value作为variable的初始值。这个初始值可以是任意type或者shape的Tensor。 在构建variable后, 它的type和shape被固定。而它的值,则可以通过调用assign()方法被改变。

如果想要改变shape, 则可以使用assign() op, 同时,它的参数要做如下设置:validate_shape=False.(例子里会用到)

1.2:variable与Tensor关系:
和Tensor一样,由Variable()创建出的variable在Graph中,可以作为其它op的输入。此外,所有为Tensor class重载的操作,均可以以应用于variable. 所以咱们可以在graph中增加节点(op). 这些节点对variable进行操作。(因为variable可以当做Tensor运算)

举例来说:
import tensorflow as tf

#创建了2个variable
w1 = tf.Variable([[1,2,3],[4,5,6]])
w2 = tf.Variable([[1,2],[1,2],[1,2]])

#在graph中,w1,w2两个variable可以做Tensor用。
y = tf.matmul(w1, w2)

#使用tf.assign()换shape的方法
z = tf.assign(w2,w1,validate_shape=False)

init = tf.global_variables_initializer()



with tf.Session() as sess:
    sess.run(init)
    print(sess.run(y))
    print(sess.run(z))
    print("w1 is:", sess.run(w1), "shape is:", w1.shape)
    print("w2 is:", sess.run(w2), "shape is:", w2.shape)



 
2. Variable的初始化
当我们launch graph时, 必须在运行使用到variable的Op之前,初始化此variable.
可以使用初始化op显式初始化variable.     sess.run(w1.initializer)
初始化动作将从文件中取值给variable,或者简单的调用assign() op来分派值给variable. 事实上,Variable初始化op只是调用assign() op 把变量初始值分派给variable本身。

除了显式初始化,更普遍的方式是: 
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
则把所有variable都初始化了。

如果要创建一个初始值取决于另一个variable的变量,则要使用:initialized_value(). 它会确保初始化顺序正确。


3. 
所有的variable会自动收集在graph中。Variable的构造函数会把新的变量添加到Graph 的 GraphKeys.GLOBAL_VARIABLES. 中取。
函数global_variables()函数则可以返回当前Graph中所有该集合的内容。

在构建机器学习模型时,通常要区分可训练模型参数变量和其它变量。
为了能够指定是否可以训练,Variable构造函数制定了trainable=, 如果为True,则加入到GraphKeys.TRAINABLE_VARIABLES 集合中。
函数trainable_variables()返回此集合内容。
各种Optimizer Class使用此集合作为要优化的变量默认列表。



4. 实际使用:






 

Viewing all articles
Browse latest Browse all 158

Trending Articles