• 『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_variables被收集在名为tf.GraphKeys.GLOBAL_VARIABLEScolletion中,包含了模型中的通用参数

    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

    ExponentialMovingAverage对象会生成此类变量

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

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

  • 相关阅读:
    博客作业03--栈和队列
    博客作业02---线性表
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
    C语言博客作业--函数嵌套调用
    java课程设计——2048
    博客作业06--图
    博客作业05--查找
    博客作业04--树
    博客作业03--栈和队列
  • 原文地址:https://www.cnblogs.com/hellcat/p/9006904.html
Copyright © 2020-2023  润新知