гимнастика автогонки v0 с использованием DQN

Вопрос или проблема

В настоящее время я изучаю обучение с подкреплением и хотел бы применить его в среде car racing-v0. Я успешно реализовал это с помощью алгоритма PPO, и теперь хочу использовать алгоритм DQN, но когда я пытаюсь обучить модель, возникает следующая ошибка:

AssertionError: Алгоритм поддерживает только (<class ‘gym.spaces.discrete.Discrete’>,) в качестве пространства действий, но было предоставлено Box([-1. 0. 0.], [1. 1. 1.], (3,), float32)

Вот мой код:

import os
import gym
from stable_baselines3 import DQN
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.evaluation import evaluate_policy

environment_name="CarRacing-v0"
env = gym.make(environment_name)

#Тестирование среды
episodes = 5
for episode in range(1, episodes+1):
    obs = env.reset()
    done = False
    score = 0
    
    while not done:
        env.render()
        action = env.action_space.sample()
        obs, reward, done, info = env.step(action)
        score += reward
    print('Эпизод:{} Очки:{}'.format(episode, score))
env.close()

env = gym.make(environment_name)
env = DummyVecEnv([lambda: env])

log_path = os.path.join('Training', 'Logs')
model = DQN('CnnPolicy', env, verbose=1, tensorboard_log = log_path)

Я использую Jupyter Notebook для этого проекта

Говорится, что модель работает только с дискретными средами, попробуйте добавить continuous=False при создании среды.

Дополнительная информация
https://www.gymlibrary.dev/environments/box2d/car_racing/
https://stable-baselines3.readthedocs.io/en/master/guide/algos.html

Ответ или решение

Для успешного применения алгоритма глубокого обучения с подкреплением (DQN) на среде CarRacing-v0, необходимо учитывать некоторые особенности самой среды и некоторые ограничения алгоритма DQN. Давайте разберемся с вашей проблемой и предложим возможные решения.

Проблема

Вы получаете ошибку:

AssertionError: The algorithm only supports (<class 'gym.spaces.discrete.Discrete',) as action spaces but Box([-1. 0. 0.], [1. 1. 1.], (3,), float32) was provided

Эта ошибка возникает потому, что алгоритм DQN предназначен для работы только с дискретными пространствами действий. Среда CarRacing-v0, напротив, использует непрерывное пространство действий, что и является основной причиной вашей проблемы.

Устранение проблемы

1. Переход на алгоритмы, работающие с непрерывными действиями

Так как DQN не поддерживает непрерывные пространства действий, лучшим решением будет использовать другой алгоритм, например, PPO (Proximal Policy Optimization) или SAC (Soft Actor-Critic). Эти алгоритмы корректно работают с непрерывными пространствами действий. С вашими уже существующими наработками с PPO вы можете использовать его и в дальнейшем для обучения в этой среде.

2. Использование алгоритмов, поддерживающих дискретные пространства действий

Если вам все же необходимо использовать DQN, вам придется модифицировать пространство действий. Однако учтите, что это приведет к потере качества управления автомобилем, поскольку дискретизация действий может быть недостаточно детализированной для эффективного управления.

Примерно так можно реализовать дискретизацию действий (например, использовать ActionWrapper):

from stable_baselines3.common import gym

class DiscreteCarRacing(gym.ActionWrapper):
    def __init__(self, env):
        super(DiscreteCarRacing, self).__init__(env)

    def action(self, action):
        # Дискретизация действий
        # Маппинг из дискретного действия в непрерывное
        # Например, определим 5 действий: ускорение, торможение, и различные углы поворота
        # Вам нужно будет доработать маппинг действий
        if action == 0:
            return [1, 0, 0]  # Вперёд
        elif action == 1:
            return [0, 1, 0]  # Назад
        elif action == 2:
            return [0, 0, 1]  # Поворот влево
        elif action == 3:
            return [0, 0, -1]  # Поворот вправо
        else:
            return [0, 0, 0]  # Ничего не делать

# Теперь оберните вашу среду
env = DiscreteCarRacing(env)

Рекомендации

Как только среда будет адаптирована, вы можете продолжить обучение вашей модели DQN, как прежде:

log_path = os.path.join('Training', 'Logs')
model = DQN('MlpPolicy', env, verbose=1, tensorboard_log=log_path)
model.learn(total_timesteps=10000)

Заключение

Работа с Reinforcement Learning требует понимания особенностей используемых algoritмов и учитываемых сред. Ваша текущая ошибка связана с несовместимостью DQN и пространства действий CarRacing-v0. Переработка среды или использование подходящего алгоритма помогут вам избежать данных проблем. Рекомендуется также следить за новыми версиями библиотек, такими как Stable Baselines3, для нахождения наиболее актуальных решений и методов.

Оцените материал
Добавить комментарий

Капча загружается...