【问题标题】:What's the differences between tf.GraphKeys.TRAINABLE_VARIABLES and tf.GraphKeys.UPDATE_OPS in tensorflow?tensorflow 中的 tf.GraphKeys.TRAINABLE_VARIABLES 和 tf.GraphKeys.UPDATE_OPS 有什么区别?
【发布时间】:2018-01-15 09:47:32
【问题描述】:

这里是tensorflow中tf.GraphKeys的doc,如TRAINABLE_VARIABLES:Variable对象的子集,将被优化器训练。

我知道tf.get_collection(),它可以找到你想要的一些张量。

使用tensorflow.contrib.layers.batch_norm()时,参数updates_collections默认值为GraphKeys.UPDATE_OPS

我们如何理解这些集合,以及它们之间的区别。

此外,我们可以在 ops.py 中找到更多内容。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    这是两个不同的东西。

    TRAINABLE_VARIABLES

    TRAINABLE_VARIABLES变量或训练参数的集合,在最小化损失时应该修改这些参数。例如,这些可以是确定网络中每个节点执行的功能的权重。

    如何将变量添加到此集合中?当您使用 tf.get_variable 定义新变量时,这会自动发生,除非您指定

    tf.get_variable(..., trainable=False)
    

    您希望变量何时不可训练?这种情况时有发生。例如,有时您会希望使用两步法,首先在大型通用数据集上训练整个网络,然后在与您的问题特别相关的较小数据集上微调网络。在这种情况下,您可能只想微调网络的一部分,例如最后一层。将某些变量指定为不可训练是执行此操作的方法之一。

    UPDATE_OPS

    UPDATE_OPSops 的集合(图运行时执行的操作,如乘法、ReLU 等),而不是变量。具体来说,这个集合维护了一个需要在每个训练步骤之前运行的操作列表。

    如何将操作添加到此集合中? 根据定义,update_ops 通过损失最小化发生在常规训练流程之外,因此通常您只会在特殊情况下将操作添加到此集合中。例如,在执行批标准化时,您希望在每个训练步骤之前重新计算批均值和方差,这就是它的完成方式。使用tf.contrib.layers.batch_norm 进行批量标准化的机制在this article 中有更详细的描述。

    【讨论】:

    • “需要在每个训练步骤之后运行的操作” - 你的意思是“之后”还是“之前”?通常 UPDATE_OPS,在批量标准化的上下文中,用于 tf.control_dependencies,该 with 块包含更新可训练变量的实际训练操作。你的意思是“之前”吗?
    • 感谢@Syncopated!你说的对。编辑答案以反映这一点。
    【解决方案2】:

    不同意前面的回答。
    其实一切都是tensorflow中的OP,TRAINABLE_VARIABLES集合中的变量也是OPs,由OPtf.get_variabletf.Variable创建。

    对于UPDATE_OPS 集合,它通常包括移动平均线和移动方差,在tf.layers.batch_norm 函数中创建。这些操作也可以被视为变量,因为它们的值在每个训练步骤都会更新,就像权重和偏差一样。

    主要区别在于trainable变量参与了propagation的返回过程,而UPDATE_OPS中的变量不参与。它们仅在测试模式下参与推理过程,因此在 UPDATE_OPS 中的这些变量上计算网格。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 2016-11-15
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多