如何使用张量流中具有相同结构的另一个图形为一个图形赋值?

时间:2017-07-08 14:35:45

标签: tensorflow deep-learning reinforcement-learning

我试图在tensorflow中实现DQN。在这里,我有一个目标网络和一个培训网络,彼此具有相同的结构。在每10000个训练步骤开始时,我想将检查点的值加载到目标网络和训练网络,然后是stop_gradient目标网络。但是,我尝试了这些方法,但没有一个工作:

1,将两个网络放在一个图表中。但是,每次加载它们时,我都不知道如何将训练网络部分的值分配给目标网络部分。(它们以不同的值保存,因为一个是停止渐变。)

2,使用tf.graph()定义两个图并分别运行两个会话。但是,我无法将一个图形的检查点加载到另一个图形,即使它们具有相同的结构。毕竟,它们是两个不同的图形。

那么,谁能给我一些建议呢?非常感谢!

1 个答案:

答案 0 :(得分:1)

典型的方法是将所有内容放在一个图表中,将两个网络放在两个名称范围中,然后为一个范围内的每个变量创建tf.assign操作,并使用tf.group构建最终的“复制”操作。让我们假设函数create_net()构建一个网络

with tf.name_scope('main_network'):
  main_net = create_net()

with tf.name_scope('target_network):
  target_network = create_net()

main_variables = tf.get_collection(tf.GraphKeys.VARIABLES, scope='main_network') 
target_variables = tf.get_collection(tf.GraphKeys.VARIABLES, scope='target_network')

# I am assuming get_collection returns variables in the same order, please double
# check this is actually happening

assign_ops = []
for main_var, target_var in zip(main_variables, target_variables):
  assign_ops.append(tf.assign(target_var, tf.identity(main_var)))

copy_operation = tf.group(*assign_ops)

现在在session.run中执行copy_operation应该将主网络参数复制到目标网络。上面的代码应该被视为伪代码,而不是你可以复制和粘贴的东西。