通过不同的过程获取图的权重

时间:2019-10-21 14:19:08

标签: python tensorflow keras multiprocessing

我创建了一个主模型的多个副本,每个副本都以不同的过程进行处理,以便分别获取每个梯度的梯度并将它们全部应用到主模型中。 (我目前仅使用一个子进程(工作者)对其进行测试:

num_workers = 1
    master = ACNetwork()  # Creates the network
    envs = [gym.make('CartPole-v0') for i in range(num_workers)] 
    # the environment that gives me data to train on
    workers = [Worker(number=i, environment=envs[i], master_network=master,
                      counter=counter) for i in range(num_workers)]
    for worker in workers:
        worker.start()

我的问题是我在父流程中创建了主模型,将其作为参数传递给每个子流程,并且获得权重会导致值错误:

# The worker executes
def run(self):
        with tf.Session(graph=tf.Graph()) as sess:
            self.private_net = ACNetwork()
.......
            a_grads, c_grads = self.private_net.get_gradients()
            self.master.update_from_gradients(a_grads, c_grads)
# now inside the master network
def update_from_gradients(self, actor_gradients, critic_gradients):
        grads_and_vars = list(zip(actor_gradients, self.actor_t.get_weights()))  
        # get_weights raises the error
        train_op = self.actor_opt.apply_gradients(grads_and_vars)

提高:

ValueError: Tensor Tensor("dense_4/kernel:0", shape=(4, 512), dtype=float32_ref) is not an element of this graph

据我了解,更新权重的代码是在不需要主网络的图形内执行的,因此会引起错误。如何保存主网络的图,以便可以在子进程的上下文中对其进行更新?

1 个答案:

答案 0 :(得分:0)

您必须在每个过程中创建模型并设置相等的权重,并在不关闭过程的情况下将模型保留在那里。您将需要控制它们之间的火车流,使进程等待主线程,反之亦然。这可能太难了,还有其他选择。

您不需要通过并行批处理的流程,可以创建并行模型:

mainModel = ....

inputs = []
outputs = []
for i in range(num_workers):
    inp = Input(input_shape)
    out = mainModel(inp)
    inputs.append(inp)
    outputs.append(out)

parallelModel = Model(inputs, outputs)

训练num_workers不同的数据组:

parallelModel.fit(
               [xTrain1, xTrain2,...],
               [yTrain1, yTrain2,...]
               )

如果您使用急切执行,即使没有并行模型或其他进程,也可以传递num_workers批处理,计算其梯度,求和它们的梯度,最后应用梯度。

如果您真的想使用并行处理而不创建建议的并行模型,则可能应该使用multiprocessing.dummy并在主线程中保留一个模型,而只使用工人来传递数据和获取梯度。

现在,甚至更简单地,使用num_workers倍于每个并行批处理大小的批处理大小,将得到相同的结果。