Как мне сделать так, чтобы мой np.split заканчивался равным делением?

#python-3.x #numpy #split #reinforcement-learning #openai-gym

Вопрос:

Я репетирую, чтобы улучшить свои навыки в разработке игры, используя учебник по обучению с подкреплением, но затем у меня возникают проблемы с тем, чтобы np.split выполнялся правильно (т. Е. Не приводил к равному разделению). В приведенном ниже коде показан сеанс определения вознаграждения при определении параметров среды в другом файле py. Следующая строка затем вызывает проблему, отображаемую в части сведений о трассировке.

 rewards_per_thousand_episodes = np.split(np.array(rewards_all_episodes), num_episodes/1000)
 

Пытался найти решение этой проблемы, но тщетно. Любые предложения по решению будут высоко оценены…;o)

Определение Env:

 import numpy as np
import gym
import random
import time
from IPython.display import clear_output

env = gym.make("FrozenLake-v1")
env.reset()

# Construct Q-table, and initialize all the Q-values to zero for each state-action pair

action_space_size = env.action_space.n
state_space_size = env.observation_space.n

q_table = np.zeros((state_space_size, action_space_size))

print("nq_table")
print(q_table)

# Initializing Q-Learning Parameters

num_episodes = 10000 # total number of episodes the agent is to play during training
max_steps_per_episode = 100 # maximum number of steps that agent is allowed to take within a single episode

learning_rate = 0.1
discount_rate = 0.99

exploration_rate = 1
max_exploration_rate = 1 # bounds to how small exploration rate can be
min_exploration_rate = 0.01 # bounds to how large exploration rate can be

# rate at which the exploration_rate will decay
# LR changed to 0.001 due to inconsistencies in results with larger rate - https://youtu.be/HGeI30uATws?t=57
exploration_decay_rate = 0.001
 

Определение вознаграждения:

 import numpy as np
import random
from .... import 
    num_episodes, env, max_steps_per_episode, q_table, learning_rate, exploration_rate, discount_rate, 
    min_exploration_rate, max_exploration_rate, exploration_decay_rate

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 update - https://youtu.be/HGeI30uATws?t=298
        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_per_thousand_episodes = np.split(np.array(rewards_all_episodes), num_episodes/1000)
count = 1000
print("n********Average reward per thousand episodes********")
for r in rewards_per_thousand_episodes:
    print(count, ": ", str(sum(r/1000)))
    count  = 1000

print("n********Updated Q-table********")
print(q_table)
 

Информация о возврате:

 Traceback (most recent call last):
File "C:UsersjcstPycharmProjects..._test_Q_learning_and_Gym_run.py", line 48, in <module>
rewards_per_thousand_episodes = np.split(np.array(rewards_all_episodes), num_episodes/1000)
File "<__array_function__ internals>", line 5, in split
File "C:UsersjcstPycharmProjectsPython_3_9_testvenvlibsite-packagesnumpylibshape_base.py", line 872, in split
raise ValueError(
ValueError: array split does not result in an equal division
 

Комментарии:

1. Поэкспериментируйте с split (или array_split ) в интерактивном сеансе python. Протестируйте небольшие фрагменты кода, прежде чем использовать их в чем-то сложном. Хорошие ответы обычно так и делают.

2. Отлично, тх. Это сработало с array_split. Обычно я занимаюсь учебными пособиями, чтобы выполнить тест на собственных данных, а затем, например, обновить/скорректировать параметры, значения и т. Д., Чтобы понять механизмы.