首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并行运行模型的多个克隆

并行运行模型的多个克隆
EN

Stack Overflow用户
提问于 2018-02-16 11:13:17
回答 1查看 200关注 0票数 0

因此,我正在尝试使用进化策略实现一种强化学习算法。

原则是克隆你的原始模型N次(比如说100次),在这100个克隆上施加一些噪声,运行它们,检查哪些给出了最好的结果,并使用它来更新原始模型。

现在,我正在尝试将这些克隆放在不同的线程中,并将它们全部并行运行。

下面是我的Worker类:

代码语言:javascript
运行
复制
class WorkerThread(Thread):

    def __init__(self, action_dim, img_dim, sigma, sess):
        Thread.__init__(self)
        #sess = tf.Session()
        self.actor = ActorNetwork(sess, action_dim, img_dim)
        self.env = Environment()
        self.reward = 0
        self.N = {}
        self.original_model = None
        self.sigma = sigma

    def setActorModel(self, model):
        self.original_model = model

    def run(self):
        k = 0
        for l in self.actor.model.layers:
            if len(np.array(l.get_weights())) > 0:
                # First generate some noise
                shape = (np.array(l.get_weights()[0])).shape
                if len(shape) == 2:
                    self.N[k] = np.random.randn(shape[0], shape[1])
                else:
                    self.N[k] = np.random.randn(shape[0], shape[1], shape[2], shape[3])
                # 2nd set weights using original model's weights and noise
                la = self.original_model.layers[k]
                self.actor.model.layers[k].set_weights((la.get_weights()[0] + self.sigma * self.N[k], la.get_weights()[1]))

            k += 1

        ob = self.env.reset()

        while True:
            action = self.actor.predict(np.reshape(ob['image'], (1, 480, 480, 3)))
            ob = self.env.step(action[0])

            if ob['done']:
                self.reward = ob['reward']
                break

因此,每个工作线程都有自己的模型,在运行时,我使用原始模型的权重设置权重。

这时,我得到了以下错误

代码语言:javascript
运行
复制
  File "/usr/local/lib/python3.6/site-packages/keras/engine/topology.py", line 1219, in set_weights
    K.batch_set_value(weight_value_tuples)
  File "/usr/local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2365, in batch_set_value
    assign_op = x.assign(assign_placeholder)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 594, in assign
    return state_ops.assign(self._variable, value, use_locking=use_locking)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/state_ops.py", line 276, in assign
    validate_shape=validate_shape)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/gen_state_ops.py", line 59, in assign
    use_locking=use_locking, name=name)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 350, in _apply_op_helper
    g = ops._get_graph_from_inputs(_Flatten(keywords.values()))
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 5055, in _get_graph_from_inputs
    _assert_same_graph(original_graph_element, graph_element)
  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 4991, in _assert_same_graph
    original_item))
ValueError: Tensor("Placeholder:0", shape=(5, 5, 3, 24), dtype=float32) must be from the same graph as Tensor("conv2d_11/kernel:0", shape=(5, 5, 3, 24), dtype=float32_ref).

在上面的代码示例中,我在所有线程中使用相同的tensorflow会话。我尝试为每一个创建不同的会话,但我得到了相同的错误。

我对tensorflow知之甚少,有谁知道如何修复它吗?

EN

回答 1

Stack Overflow用户

发布于 2018-02-17 08:52:18

您需要在所有线程中使用相同的图。在主线程中创建一个tf.Graph(),并将每个线程的函数包装在"with my_graph.as_default():“中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48819561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档