繁体   English   中英

deque 的大小如何影响 Tensorflow 模型的训练速度?

[英]How does the size of deque affect the training speed of a Tensorflow model?

我已经多次使用 tensorflow 模型运行完全相同的 python 脚本。 只有一处不同。 一半的脚本使用大小为 500000 的双端队列,另一半使用大小为 1000000 的双端队列作为经验存储。 从存储中随机选择一批 512 个样本进行训练。

网络仍在训练中,但到目前为止,那些双端队列为 500k 的网络要快 10% 左右。 看来距离越来越远了。 当然,从更大的内存中随机选择 512 可能需要更长的时间。 但是 10% 超过整个训练过程?

代码看起来像这样

...
self.memory = deque(maxlen=1000000)
...
def experience_replay(self):
        if len(self.memory) < 512:
            return
        batch = random.sample(self.memory, 512)
        state_batch = np.zeros((512, 6, 7, 2))
        q_values_batch = np.zeros((512, 7))
        idx = 0
        for state, action, reward, state_next, terminal in batch:
            q_update = reward
            if not terminal:
                state_next = np.expand_dims(state_next, axis=0)
                q_update = (reward + 0.95 * np.amax(self.model.predict(state_next)[0]))
            state = np.expand_dims(state, axis=0)
            q_values = self.model.predict(state)
            q_values[0][action] = q_update
            state_batch[idx, ...] = state
            q_values_batch[idx, ...] = q_values
            idx = idx + 1

        self.model.fit(state_batch, q_values_batch, verbose=0)
        self.exploration_rate *= 0.9998
        self.exploration_rate = max(0.01, self.exploration_rate)

什么可能导致这种加速?

FWIW、 deque()random.sample()不能有效地协同工作。 双端队列在端点附近的访问速度很快,但对于中间的索引查找则为 O(n)。 这是有问题的,因为random.sample()对双端队列进行重复的索引查找。 问题中显示的代码片段最好使用列表。

原始问题的准确答案是从n长度的双端队列中提取k 个样本所需的时间与k * n / 4成正比。 从算法上讲,将大小加倍通常会使运行时间的预期值加倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM