我有三个网络,称为V,V_target和Actor,我正在尝试实现以下设置:
对于熟悉深度RL的人,我在演员评论算法中使用它,在价值和策略网络之间共享图层,加上目标网络V_target。我尝试了以下方法:
def shared(...):
# define some variables, e.g.
W = get_variable('W', ...)
def Actor(...):
with tf.variable_scope("shared"):
shared_out = shared(...)
... actor-specific layers ...
def V(...):
with tf.variable_scope("shared", reuse=True):
shared_out = shared(...)
... V-specific layers...
with tf.variable_scope("Policy"):
actor_out = Actor(...)
with tf.variable_scope("V_main"):
V_out = V(...)
with tf.variable_scope("V_target"):
V_target = V(...)
正如预期的那样,这不起作用,因为使用最外面的variable_scope
会阻止Policy和V_main之间的共享:变量W
在一个范围内具有名称Policy/shared/W
但名称为V_main/shared/W
{1}}在第二范围内。
为什么不使用tf.name_scope("Policy")
和tf.name_scope("V_main")
?如果我这样做,可以定义shared
变量,但是我没有很好的方法来获取V_main
和V_target
下的变量。具体来说,因为tf.name_scope
没有向tf.get_variable
创建的名称添加任何内容,所以我无法使用tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES ,'V_main')
和tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES ,'V_target')
来获取所谓的“目标更新”的两组对象”
有什么聪明的方法吗?
答案 0 :(得分:0)
我建议你做这个问题中描述的技巧:How to create variable outside of current scope in Tensorflow?
您可以通过提供现有范围的实例来清除当前变量范围。
所以你只需要定义tf.variable_scope("shared")
一次,记住对这个实例的引用并在所有其他变量范围内使用它(使用reuse=True
)。无论外部范围是什么,都会在W
范围内创建shared
变量。