什么';s Tensorflow中变量和资源变量之间的差异

什么';s Tensorflow中变量和资源变量之间的差异,tensorflow,Tensorflow,在tensorflow中,变量是一种资源,从ResourceBase继承并由ResourceMgr管理。但是为什么还有另一个东西叫做ResourceVariable呢?它们都可以用于梯度下降之类的优化器(见下图)。有什么区别?我知道前者有很好的文档记录,并且是最常用的。后一个的目的是什么?ResourceVariable是Variable的替代品,其目的是清理Variable语义的一些更混乱的方面 ResourceVariable是TF2.0中的默认值,您很可能不关心两者之间的差异,除非您正在深

在tensorflow中,变量是一种资源,从ResourceBase继承并由ResourceMgr管理。但是为什么还有另一个东西叫做ResourceVariable呢?它们都可以用于梯度下降之类的优化器(见下图)。有什么区别?我知道前者有很好的文档记录,并且是最常用的。后一个的目的是什么?

ResourceVariable
Variable
的替代品,其目的是清理
Variable
语义的一些更混乱的方面


ResourceVariable
是TF2.0中的默认值,您很可能不关心两者之间的差异,除非您正在深入研究Tensorflow实现的细节。当启用了急切执行时,
tf.Variable
也会创建资源变量

所以现在只需使用
tfVariable
,它几乎肯定是您想要的;如果您遇到代码中变量值不一致导致的类似争用条件或bug的问题,您可以尝试启用资源变量(通过将
use\u resource=True
传递给您的变量创建代码或调用tf.x中的
tf.enable\u resource\u variables()

与tf.Variable不同,tf.ResourceVariable具有定义良好的语义。 每次在TensorFlow图中使用ResourceVariable都会添加一个 对图形执行读取值操作。由a返回的张量 读取值操作保证可以看到对 在任何操作中发生的变量的值 读取值取决于(直接、间接或通过控件 并保证不会看到对 读取值操作不依赖的变量。 例如,如果有多个任务分配给 单个会话中的ResourceVariable.run调用存在定义良好的 如果 赋值和读取通过图形中的边连接。考虑 下面的示例中,两次写入可能导致tf.Variable和 tf.ResourceVariable的行为不同:

要强制执行这些一致性属性,tf.ResourceVariable可能会 在引擎盖下制作比同等tf.变量更多的副本,所以 变量仍然没有被弃用


你指的是哪些评论?可能是这个:我在tensorflow.org上找不到tf1.10的
tf.ResourceVariable
文档。在以后的版本中是否删除了此选项?如果是,那么
tf.Variable
的实现是否解决了上述问题?
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()