在tensorflow中,Variable是一个资源,继承自ResourceBase并由ResourceMgr管理.但为什么还有另一个名为ResourceVariable的东西?它们都可以用于像gradient_descent这样的优化器(参见本例).有什么不同?我知道前者有很好的记录并且最常用.后者的目的是什么?
小智 18
ResourceVariable是替代Variable,旨在清理语义的一些更混乱的方面Variable.
ResourceVariable是TF 2.0中的默认值,除非您正在处理Tensorflow实现的深层细节,否则您很可能不关心两者之间的差异.启用eager执行时,tf.Variable还会创建资源变量.
所以tfVariable现在就用它,它几乎可以肯定你想要的; 如果您遇到类似竞争条件的问题或代码中变量值不一致的错误,您可以尝试启用资源变量(通过传递use_resource=True给您的变量创建代码或调用tf.enable_resource_variables()TF 1.x).
从评论:
与tf.Variable不同,tf.ResourceVariable具有明确定义的语义。TensorFlow图中ResourceVariable的每次使用都会向该图添加read_value操作。保证read_value操作返回的Tensor可以看到对变量值的所有修改,这些修改发生在read_value所依赖的任何操作中(直接,间接或通过控件依赖项),并且保证看不到对该变量的任何修改。 read_value操作不依赖的变量的值。例如,如果在单个session.run调用中有多个对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()
Run Code Online (Sandbox Code Playgroud)
为了强制执行这些一致性属性,tf.ResourceVariable可能比等效的tf.Variable产生更多的副本,因此仍不建议使用tf.Variable。
| 归档时间: |
|
| 查看次数: |
3870 次 |
| 最近记录: |