『TensorFlow』使用集合collection控制variables
Variable
Tensorflow使用Variable
类表达、更新、存储模型参数。
Variable
是在可变更的,具有保持性的内存句柄,存储着Tensor
- 在整个
session
运行之前,图中的全部Variable
必须被初始化
Variable
的值在sess.run(init)之后就确定了Tensor
的值要在sess.run(x)之后才确定
- 创建的
Variable
被添加到默认的collection
中
tf.GraphKeys
中包含了所有默认集合的名称,可以通过查看__dict__发现具体集合。
被收集在名为tf.GraphKeys.
GLOBAL_VARIABLES:global_variablestf.GraphKeys.GLOBAL_VARIABLES
的colletion
中,包含了模型中的通用参数
tf.GraphKeys.TRAINABLE_VARIABLES:
tf.Optimizer默认
只优化tf.GraphKeys.TRAINABLE_VARIABLES
中的变量。
函数 | 集合名 | 意义 |
---|---|---|
tf.global_variables() | GLOBAL_VARIABLES |
存储和读取checkpoints时,使用其中所有变量 跨设备全局变量集合 |
tf.trainable_variables() | TRAINABLE_VARIABLES |
训练时,更新其中所有变量 存储需要训练的模型参数的变量集合 |
tf.moving_average_variables() | MOVING_AVERAGE_VARIABLES |
实用指数移动平均的变量集合 |
tf.local_variables() | LOCAL_VARIABLES |
在 进程内本地变量集合 |
tf.model_variables() | MODEL_VARIABLES |
Key to collect model variables defined by layers. 进程内存储的模型参数的变量集合 |
QUEUE_RUNNERS | 并非存储variables,存储处理输入的QueueRunner | |
SUMMARIES | 并非存储variables,存储日志生成相关张量 |
除了上表中的函数外(上表中最后两个集合并非变量集合,为了方便一并放在这里),还可以使用tf.get_collection(集合名)获取集合中的变量,不过这个函数更多与tf.get_collection(集合名)搭配使用,操作自建集合。
另,slim.get_model_variables()与tf.model_variables()功能近似。
Summary
Summary
被收集在名为tf.GraphKeys.
UMMARIES
的colletion
中,
Summary
是对网络中Tensor
取值进行监测的一种Operation
- 这些操作在图中是“外围”操作,不影响数据流本身
- 调用tf.scalar_summary系列函数时,就会向默认的
collection
中添加一个Operation
自定义集合
除了默认的集合,我们也可以自己创造collection
组织对象。网络损失就是一类适宜对象。
tensorflow中的Loss提供了许多创建损失Tensor
的方式。
x1 = tf.constant(1.0) l1 = tf.nn.l2_loss(x1) x2 = tf.constant([2.5, -0.3]) l2 = tf.nn.l2_loss(x2)
创建损失不会自动添加到集合中,需要手工指定一个collection
:
tf.add_to_collection("losses", l1) tf.add_to_collection("losses", l2)
创建完成后,可以统一获取所有损失,losses
是个Tensor
类型的list:
losses = tf.get_collection('losses')
一种常见操作把所有损失累加起来得到一个Tensor
:
loss_total = tf.add_n(losses)
执行操作可以得到损失取值:
sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) losses_val = sess.run(losses) loss_total_val = sess.run(loss_total)
实际上,如果使用TF-Slim包的losses系列函数创建损失,会自动添加到名为”losses”的collection
中。