[英]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.