【问题标题】:What is the purpose of graph collections in TensorFlow?TensorFlow 中图形集合的目的是什么?
【发布时间】:2015-12-12 02:26:40
【问题描述】:

API 讨论了Graph Collections,从code 判断是通用密钥/数据存储。这些收藏的目的是什么?

【问题讨论】:

标签: python tensorflow


【解决方案1】:

请记住,在底层,Tensorflow 是一个用于指定然后执行计算数据流图的系统。图形集合用作跟踪构建的图形以及它们必须如何执行的一部分。例如,当您创建某些类型的操作时,例如tf.train.batch_join,添加操作的代码也会将一些队列运行器添加到QUEUE_RUNNERS 图形集合中。稍后,当你调用start_queue_runners() 时,默认情况下,它会查看QUEUE_RUNNERS 集合以知道要启动哪些跑步者。

【讨论】:

  • 我仍然对集合的概念感到困惑。通过将不同的操作添加到不同的集合中,是否使操作查找更有效?似乎该集合仅适用于将操作分组或组织在一起,而不会为计算带来任何“真正的”好处,对吧?这里“真实”的意思是如果我从 tensorflow 系统中删除收集的概念,它不会损害计算。
  • 不,收藏的重点不是效率,重点是记账。集合用于了解应该训练哪些变量。或者必须调用哪些操作进行培训。集合是从字符串到图位集的映射。几个已知的字符串存储在 GraphKeys 中。这些是指重要的图形位集(即操作、变量等)
【解决方案2】:

到目前为止,我认为至少有两个好处:

  1. 当您在多个 GPU 或机器上分发程序时,可以方便地从同一集合中的不同设备收集损失。使用 tf.add_n 将它们相加以累积损失。
  2. 以我自己的方式更新一组特定的变量,例如权重和偏差。

例如:

import tensorflow as tf    
w = tf.Variable([1,2,3], collections=[tf.GraphKeys.WEIGHTS], dtype=tf.float32)    
w2 = tf.Variable([11,22,32], collections=[tf.GraphKeys.WEIGHTS], dtype=tf.float32)
weight_init_op = tf.variables_initializer(tf.get_collection_ref(tf.GraphKeys.WEIGHTS))
sess = tf.InteractiveSession()
weight_init_op.run()
for vari in tf.get_collection_ref(tf.GraphKeys.WEIGHTS): 
    tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, vari.assign(0.2 * vari))
weight_update_ops = tf.get_collection_ref(tf.GraphKeys.UPDATE_OPS)
for op in weight_update_ops:
    print(op.eval())

输出:

[0.2 0.4 0.6]
[2.2 4.4 6.4]

【讨论】:

  • 关于你的代码的小注释......当你启动一个 tf.InteractiveSession() 时,你为什么不从中受益呢?如...使用 weight_init_op.run() 和 weight_update_ops.eval()
  • @zwep 是的,你是对的。也许我写这篇文章时不知道那个技巧。无论如何,我的代码有效。
猜你喜欢
  • 2017-11-22
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
相关资源
最近更新 更多