тренажерный зал RL с MultiDiscrete ActionSpace AttributeError: объект ‘MultiDiscrete’ не имеет атрибута ‘spaces’

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

Я пытаюсь создать алгоритм обучения с подкреплением, который может играть в игру MasterMind. Я использую пространство MultiDiscrete для действий и наблюдений. Пространство действий занимает 4 слота с 6 цветами каждый, а пространство наблюдений — это 2×4. Я создал собственную среду для соединения с моей программируемой игрой. Среда еще не готова из-за возникающей ошибки. Возможно, кто-то сможет помочь мне решить эту проблему.

import gym as gym
from gym import Env
from gym.spaces import Discrete, Box, MultiDiscrete, Dict
from stable_baselines3.common.policies import MultiInputActorCriticPolicy

action_space = MultiDiscrete(np.array([6,6,6,6]), dtype=int)
observation_space = MultiDiscrete(np.array([4,4]), dtype=int)

...

class MasterMindEnv(Env):
    def __init__(self) -> None:
        super(MasterMindEnv, self).__init__()
        self.action_space = action_space
        self.observation_space = observation_space

    def step(self, action:np.ndarray):
        pass_action(action)
        output = get_output()
        print(output)

        reward = output[0] + output[1]
        print(reward)
    
        done = False
        info = {}

        return observation_space.sample(), 1, done, info

    def reset(self):
        return self.observation_space.sample()
    
...

model = A2C(MultiInputActorCriticPolicy, env)
model.learn(total_timesteps=1000)

А ошибка:

AttributeError                            Traceback (most recent call last)
c:\...\model.ipynb Zelle 10 in <module>
----> 1 model = A2C(MultiInputActorCriticPolicy, env)
      2 model.learn(total_timesteps=1000)


File c:\...\Python310\lib\site-packages\stable_baselines3\a2c\a2c.py:126, in         
A2C.__init__(self, policy, env, learning_rate, n_steps, gamma, gae_lambda, ent_coef,     
vf_coef, max_grad_norm, rms_prop_eps, use_rms_prop, use_sde, sde_sample_freq, 
normalize_advantage, tensorboard_log, create_eval_env, policy_kwargs, verbose, seed, 
device, _init_setup_model)
    123     self.policy_kwargs["optimizer_kwargs"] = dict(alpha=0.99, 
eps=rms_prop_eps, weight_decay=0)
    125 if _init_setup_model:
--> 126     self._setup_model()

File c:\...\Python310\lib\site- 
packages\stable_baselines3\common\on_policy_algorithm.py:123, in 
OnPolicyAlgorithm._setup_model(self)
   112 buffer_cls = DictRolloutBuffer if isinstance(self.observation_space, 
gym.spaces.Dict) else RolloutBuffer
    114 self.rollout_buffer = buffer_cls(
    115     self.n_steps,
    116     self.observation_space,
   (...)
    121     n_envs=self.n_envs,
    122 )
--> 123 self.policy = self.policy_class(  # pytype:disable=not-instantiable
...
--> 258 for key, subspace in observation_space.spaces.items():
    259     if is_image_space(subspace):
    260         extractors[key] = NatureCNN(subspace, features_dim=cnn_output_dim)

AttributeError: 'MultiDiscrete' object has no attribute 'spaces'

У меня была такая же проблема, когда я тестировал свою пользовательскую среду. Все это происходит из-за MultiDiscrete пространства наблюдений.

self.observation_space = MultiDiscrete(max_machine_states_vec + [scheduling_horizon+2]) ### Пространство наблюдений это 0,...,L для каждой машины + состояние планирования включая "ns" (None = "ns")

Вам не нужно менять пространство наблюдений, измените алгоритм, который вы используете. A2C или PPO не могут работать с MultiDiscrete пространствами наблюдений. DQN может с ними работать. Поэтому ваш код должен импортировать DQN.

from stable_baselines3 import DQN
# Все промежуточные части кода
model = DQN('MlpPolicy', env, verbose = 1)

Надеюсь, ваша проблема решена.

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

Ошибка, с которой вы столкнулись в вашем коде Reinforcement Learning, связана с ограничениями, касающимися обработки пространства наблюдения MultiDiscrete в некоторых алгоритмах обучения, таких как A2C или PPO. Эти алгоритмы не поддерживают MultiDiscrete пространство наблюдения, что приводит к ошибке AttributeError: ‘MultiDiscrete’ object has no attribute ‘spaces’.

Проблема

Ваш код создает кастомную среду для игры MasterMind, где вы определяете Action Space как MultiDiscrete([6, 6, 6, 6]) и Observation Space как MultiDiscrete([4, 4]). При попытке использования алгоритма A2C возникает ошибка из-за несовместимости A2C с MultiDiscrete Observation Space.

Решение

Для решения данной проблемы вам потребуется заменить используемый алгоритм A2C на тот, который поддерживает MultiDiscrete пространство наблюдения. В данном случае, алгоритм DQN является подходящим выбором, так как он может работать с MultiDiscrete Observation Space.

Шаги для исправления:

  1. Импортируйте алгоритм DQN из библиотеки stable_baselines3:

    from stable_baselines3 import DQN
  2. Инициализируйте модель с использованием алгоритма DQN вместо A2C:

    model = DQN('MlpPolicy', env, verbose=1)
  3. Запустите обучение:

    model.learn(total_timesteps=1000)

Преимущества и Ожидаемый Результат

Использование алгоритма DQN обеспечит совместимость с вашим MultiDiscrete пространством наблюдения. Это позволит избежать ошибок и наладить процесс обучения RL-алгоритма для игры в MasterMind. Замена алгоритма поможет достичь эффективности в обучении модели, избегая переписывания логики вашей кастомной среды.

Заключение

Изменив подход к выбору алгоритма, вы сможете успешно настроить и обучить RL-агента для вашей задачи. Убедитесь, что используете алгоритмы и методы, совместимые с определенным пространством действия и наблюдения, чтобы минимизировать вероятность подобных ошибок в будущем.

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

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