不同variable_scope下的Tensorflow共享变量

时间:2018-02-27 22:21:55

标签: python tensorflow machine-learning scope reinforcement-learning

我有三个网络,称为V,V_target和Actor,我正在尝试实现以下设置:

  1. V和Actor分享某些图层。
  2. V_target与V。
  3. 完全相同

    对于熟悉深度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_mainV_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')来获取所谓的“目标更新”的两组对象”

    有什么聪明的方法吗?

1 个答案:

答案 0 :(得分:0)

我建议你做这个问题中描述的技巧:How to create variable outside of current scope in Tensorflow?

  

您可以通过提供现有范围的实例来清除当前变量范围。

所以你只需要定义tf.variable_scope("shared")一次,记住对这个实例的引用并在所有其他变量范围内使用它(使用reuse=True)。无论外部范围是什么,都会在W范围内创建shared变量。