在tensorflow中,Variable是一个资源,继承自ResourceBase并由ResourceMgr管理。但为什么还有另一个名为ResourceVariable的东西?它们都可以用于gradient_descent等优化器(请参阅此example)。有什么区别?我知道前者有很好的记录并且最常用。什么是后者的目的是什么?
答案 0 :(得分:14)
ResourceVariable
是Variable
的替代品,旨在清除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仍未被弃用。