我在同一个Tensorflow图中有两个神经网络,NN1和NN2。我需要用NN1的权重更新NN2的权重。为此,我执行session.run([w1_nn2.assign(w1_nn1), w2_nn2.assign(w2_nn1), ...])
,其中wi_nnj
是权重。所有这些分配都是作为原子操作执行的吗?
如果不是这种情况(我怀疑),在另一个线程中在NN1上调用apply_gradients()
时在一个Python线程中调用这些赋值是不安全的,对吧?那么以线程安全的方式执行此操作的最简单方法是什么?
答案 0 :(得分:1)
这不是原子的。如果你的变量是GB的大小,那么操作可能需要几秒钟,因此默认为这样大的op是原子的,这很奇怪。此外,有时允许多个线程同时更新同一个变量很有用,如Hogwild
中所做的那样各种变量更新操作中都有一个参数use_locking
,可防止来自多个线程的模拟更新,例如变量assign
op here
def assign(self, value, use_locking=False):
"""Assigns a new value to the variable.
This is essentially a shortcut for `assign(self, value)`.
Args:
value: A `Tensor`. The new value for this variable.
use_locking: If `True`, use locking during the assignment.