作者: 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. 实际使用: