『TensorFlow』使用集合collection控制variables

Variable

Tensorflow使用Variable类表达、更新、存储模型参数。html

  • Variable是在可变动的,具备保持性的内存句柄,存储着Tensor
  • 在整个session运行以前,图中的所有Variable必须被初始化
    • Variable的值在sess.run(init)以后就肯定了
    • Tensor的值要在sess.run(x)以后才肯定
  • 建立的Variable被添加到默认的collection

 

tf.GraphKeys中包含了全部默认集合的名称,能够经过查看__dict__发现具体集合。python

tf.GraphKeys.GLOBAL_VARIABLES:global_variables被收集在名为tf.GraphKeys.GLOBAL_VARIABLEScolletion中,包含了模型中的通用参数git

tf.GraphKeys.TRAINABLE_VARIABLES:tf.Optimizer默认只优化tf.GraphKeys.TRAINABLE_VARIABLES中的变量。github

函数 集合名 意义
tf.global_variables() GLOBAL_VARIABLES

存储和读取checkpoints时,使用其中全部变量api

跨设备全局变量集合网络

tf.trainable_variables() TRAINABLE_VARIABLES

训练时,更新其中全部变量session

存储须要训练的模型参数的变量集合函数

tf.moving_average_variables() MOVING_AVERAGE_VARIABLES

ExponentialMovingAverage对象会生成此类变量优化

实用指数移动平均的变量集合spa

tf.local_variables() LOCAL_VARIABLES

global_variables()以外,须要用tf.init_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.UMMARIEScolletion中,

  • 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中。

相关文章
相关标签/搜索