双端队列的大小如何影响Tensorflow模型的训练速度?

问题描述 投票:0回答:1

我已经多次使用张量流模型运行完全相同的python脚本。只有一个区别。脚本的一半使用大小为500000的双端队列,另一半使用1000000的双端队列作为体验存储。从存储中选择了512个随机选择的示例进行训练。

这些网络仍在训练中,但是到目前为止,拥有500k的deque的网络要快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)

什么可能导致这种加速?

python tensorflow machine-learning deque
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.