Вопрос или проблема
В настоящее время я изучаю обучение с подкреплением и хотел бы применить его в среде 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, для нахождения наиболее актуальных решений и методов.