Tensorflow中Variable和ResourceVariable之间的区别是什么

时间:2016-11-26 11:03:21

标签: tensorflow

在tensorflow中,Variable是一个资源,继承自ResourceBase并由ResourceMgr管理。但为什么还有另一个名为ResourceVariable的东西?它们都可以用于gradient_descent等优化器(请参阅此example)。有什么区别?我知道前者有很好的记录并且最常用。什么是后者的目的是什么?

2 个答案:

答案 0 :(得分:14)

ResourceVariableVariable的替代品,旨在清除Variable语义的一些混乱方面。

ResourceVariable是TF 2.0中的默认值,除非您正在处理Tensorflow实现中的详细信息,否则您很可能不关心两者之间的差异。启用急切执行时tf.Variable也会创建资源变量。

所以现在只使用tfVariable,这几乎可以肯定你想要的;如果您遇到类似竞争条件的问题或代码中变量值不一致的错误,您可以尝试启用资源变量(通过将use_resource=True传递给您的变量创建代码或在TF 1中调用tf.enable_resource_variables()。 x)的

答案 1 :(得分:3)

来自评论:

  

与tf.Variable不同,tf.ResourceVariable具有明确定义的语义。   TensorFlow图中ResourceVariable的每次使用都会增加一个   对图表的read_value操作。由...返回的Tensors   read_value操作保证看到所有修改   在任何操作中发生的变量的值   read_value取决于(直接,间接或通过控件   依赖)并保证不会看到对值的任何修改   read_value操作不依赖的变量。   例如,如果有一个以上的分配   ResourceVariable在单个session.run调用中有一个定义明确的   每个操作的值,如果使用变量的值   赋值和读取由图中的边连接。考虑   以下示例中,两次写入可能导致tf.Variable和   tf.ResourceVariable行为不同:

a = tf.ResourceVariable(1.0)
a.initializer.run()
assign = a.assign(2.0)
with tf.control_dependencies([assign]):
    b = a.read_value()
with tf.control_dependencies([b]):
    other_assign = a.assign(3.0)
with tf.control_dependencies([other_assign]):
    # Will print 2.0 because the value was read before other_assign ran. If
    # `a` was a tf.Variable instead, 2.0 or 3.0 could be printed.
    tf.Print(b, [b]).eval()
  

强制执行这些一致性属性tf.ResourceVariable可能   制作更多的副本而不是等同的tf.Variable在引擎盖下,所以   tf.Variable仍未被弃用。