强化学习训练时np.split提示数组无法均等拆分该如何解决?
问题解决思路
报错根本原因
np.split执行均等分割的前提是待分割数组的长度必须是拆分份数的整数倍,你设定的num_episodes=10000,需要拆分为10份、每份1000个元素,但实际收集的rewards_all_episodes数组长度远不等于10000,因此触发报错。
代码中的错误点
- 语法错误:奖励累加逻辑写错,
rewards_current_episode +- reward应为rewards_current_episode += reward,否则每局奖励不会正常累加 - 缩进错误:两个核心逻辑的缩进位置错误,现在被嵌套在单局内的步循环中:
- 探索率更新代码
rewards_all_episodes.append(rewards_current_episode)语句
上述代码应该移到单局步循环结束后、和外层episode循环平级的位置,保证每局结束才记录一次整局奖励,同时每局更新一次探索率。
- 优化建议:拆分处的
num_episodes/1000改为num_episodes//1000整数除法,保证传入的拆分份数为整数,避免潜在的浮点数参数问题。
修正后的核心代码片段
rewards_all_episodes = [] # Q-learning algorithm for episode in range(num_episodes): state = env.reset() # Exploration/exploitation trade-off done = False rewards_current_episode = 0 for step in range(max_steps_per_episode): exploration_rate_threshold = random.uniform(0,1) if exploration_rate_threshold > exploration_rate: action = np.argmax(q_table[state,:]) else: action = env.action_space.sample() new_state, reward, done, info = env.step(action) #Update Q-table for Q(s,a) q_table[state, action] = \ q_table[state, action] * (1 - learning_rate) + learning_rate * (reward + discount_rate * np.max(q_table[new_state, :])) state = new_state # 修正奖励累加语法 rewards_current_episode += reward if done == True: break # 以下逻辑移到步循环外,每局结束后执行 # Exploration rate decay exploration_rate = min_exploration_rate + (max_exploration_rate - min_exploration_rate) * np.exp( -exploration_decay_rate * episode) # 每局记录一次总奖励 rewards_all_episodes.append(rewards_current_episode) # 此时rewards_all_episodes长度正好为10000,可均等拆分为10份 rewards_per_thousand_episodes = np.split(np.array(rewards_all_episodes), num_episodes//1000)
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

