介绍变量之前,先对’tensor’这个单词做出解释:
3. tensor
文档中是这样说明的:
TensorFlow 程序使用 tensor 数据结构来代表所有的数据, 计算图中, 操作间传递的数据都是 tensor.
你可以把 TensorFlow tensor 看作是一个 n 维的数组或列表. 一个 tensor 包含一个静态类型 rank, 和 一个 shape.
4. 变量
变量维护图执行过程中的状态信息.
文档中给出的代码:
# coding=utf-8
# 使用变量实现一个简单的计数器
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 创建一个变量, 初始化为标量 0.
state = tf.Variable(0, name="counter")
# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 首先必须增加一个`初始化` op 到图中.
init_op = tf.initialize_all_variables()
# 启动图, 运行 op
with tf.Session() as sess:
# 运行 'init' op
sess.run(init_op)
# 打印 'state' 的初始值
print(sess.run(state))
# 运行 op, 更新 'state', 并打印 'state'
for _ in range(3):
sess.run(update)
print(sess.run(state))
得到运行结果
注意代码中使用了state = tf.Variable(0, name="counter")
来创建一个初始化为0的变量,Variable的签名为:
def __init__(self,
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
caching_device=None,
name=None,
variable_def=None,
dtype=None,
expected_shape=None,
import_scope=None,
constraint=None):
用于创建一个值为initial_value
的变量。
将新变量添加到“collections”中列出的图集合中,默认值为[GracKy.GualAlxValue]。
如果trainable是True变量也被添加到图表集合“GrimeKest.Trimable变量”中。
构造器创建一个variable
op和一个assign
op来将变量设置为其初始值。
参数:
initial_value | trainable |
---|---|
一个Tensor ,或者一个课转变为Tensor 的python对象,它是变量的初始值,除非validate_shape 被设为False,否则初始值必须指定一个形状(shape)。被调用时也可不带参数,当调用时返回初始值。在这种情况下,必须指定“dType” 。 请注意,在使用之前,来自init_ops.py 的初始化函数必须先绑定到一个shape。 |
如果为True,也会将该变量添加到图表集合GraphKeys.TRAINABLE_VARIABLES 中,该集合被用作默认的变量列表,通过Optimizer 类使用。 |
collections | validate_shape |
---|---|
图表几个的键列表,新的变量被添加到该集合。默认:[GraphKeys.GLOBAL_VARIABLES] |
如果为FALSE,则允许该变量用一个未知的shape初始化。默认为True,表示变量的shape必须明确。 |
还有几个属性,等以后遇到了再说明吧。
后面代码还使用了一个update = tf.assign(state, new_value)
op。
asssign的签名为:
def assign(ref, value, validate_shape=None, use_locking=None, name=None):
用于将value赋值给ref。
然后需要一个初始化op :
init_op = tf.initialize_all_variables()
对于该方法的一个问题,下一节会做出说明
返回一个初始化全局变量的op
代码中 assign() 操作是图所描绘的表达式的一部分, 正如 add() 操作一样. 所以在调用 run() 执行表达式之前, 它并不会真正执行赋值操作.
通常会将一个统计模型中的参数表示为一组变量. 例如, 你可以将一个神经网络的权重作为某个变量存储在一个 tensor 中. 在训练过程中, 通过重复运行训练图, 更新这个 tensor.