RLLib - Tensorflow - InvalidArgumentError: получено значение метки N, которое находится за пределами допустимого диапазона [0, N)

Я использую PPOTrainer RLLib с настраиваемой средой, я выполняю trainer.train() два раза первый завершается успешно, но когда я выполняю его во второй раз, он вылетает с ошибкой:

lib / python3.7 / site-packages / tensorflow_core / python / client / session.py", строка 1384, в _do_call (pid=15248) тип повышения (e) (node_def, op, message) (pid=15248)

tensorflow.python.framework.errors_impl.InvalidArgumentError:

Получено значение метки 5, которое находится за пределами допустимого диапазона [0, 5). > Значения на этикетке: 5 5

(pid =15248) [[узел default_policy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (определен в /tensorflow_core/python/framework/ops.py:1751) ]]

Вот мой код:

main.py

ModelCatalog.register_custom_preprocessor("tree_obs_prep", TreeObsPreprocessor)
ray.init()

trainer = PPOTrainer(env=MyEnv, config={
    "train_batch_size": 4000,
    "model": {
        "custom_preprocessor": "tree_obs_prep"
    }
})

for i in range(2):
    print(trainer.train())

MyEnv.py

class MyEnv(rllib.env.MultiAgentEnv):
    def __init__(self, env_config):
        self.n_agents = 2

        self.env = *CREATES ENV*
        self.action_space = gym.spaces.Discrete(5)
        self.observation_space = np.zeros((1, 12))

    def reset(self):
        self.agents_done = []
        obs = self.env.reset()
        return obs[0]

    def step(self, action_dict):
        obs, rewards, dones, infos = self.env.step(action_dict)

        d = dict()
        r = dict()
        o = dict()
        i = dict()
        for i_agent in range(len(self.env.agents)):
            if i_agent not in self.agents_done:
                o[i_agent] = obs[i_agent]
                r[i_agent] = rewards[i_agent]
                d[i_agent] = dones[i_agent]
                i[i_agent] = infos[i)agent]
        d['__all__'] = dones['__all__']

        for agent, done in dones.items():
            if done and agent != '__all__':
                self.agents_done.append(agent)

        return  o, r, d, i

Я понятия не имею, в чем проблема, есть предложения? Что означает эта ошибка?

1 ответ

Решение

Этот комментарий мне очень помог:

FWIW, я думаю, что такие проблемы могут возникнуть, если в выводе политики появятся NaN. Когда это произойдет, вы можете выйти за пределы допустимого диапазона.

Обычно это происходит из-за того, что наблюдение или вознаграждение каким-то образом становится NaN, хотя это также может быть расхождение в политике.

В моем случае мне пришлось изменить свои наблюдения, потому что агент не смог изучить политику, и в какой-то момент обучения (на случайном временном шаге) возвращенное действие было NaN.

Другие вопросы по тегам