运行Super Mario Bros RL代码遇JoypadSpace.reset() TypeError,如何修复?
问题:运行马里奥强化学习代码时出现TypeError: JoypadSpace.reset() got an unexpected keyword argument 'seed'
代码示例
from nes_py.wrappers import JoypadSpace import gym import gym_super_mario_bros from gym_super_mario_bros.actions import SIMPLE_MOVEMENT from gym.wrappers import GrayScaleObservation from stable_baselines3.common.vec_env import VecFrameStack,DummyVecEnv from matplotlib import pyplot as plt env = gym_super_mario_bros.make('SuperMarioBros-v0',apply_api_compatibility=True,render_mode="human") env = JoypadSpace(env, SIMPLE_MOVEMENT) env = GrayScaleObservation(env,keep_dim=True) env = DummyVecEnv([lambda:env]) env = VecFrameStack(env,4,channels_order='last') state = env.reset()
报错信息
TypeError: JoypadSpace.reset() got an unexpected keyword argument 'seed'
修复方案
方案1:降级Gym版本到0.21.x
Gym 0.26+版本在reset方法中新增了seed等参数,但旧版nes-py的JoypadSpace未适配该API。执行以下命令降级:
pip install gym==0.21.0
方案2:自定义兼容版JoypadSpace包装器
如果想保留高版本Gym,可以自定义包装器覆盖reset方法,忽略不支持的参数:
from nes_py.wrappers import JoypadSpace as OriginalJoypadSpace import gym import gym_super_mario_bros from gym_super_mario_bros.actions import SIMPLE_MOVEMENT from gym.wrappers import GrayScaleObservation from stable_baselines3.common.vec_env import VecFrameStack,DummyVecEnv from matplotlib import pyplot as plt # 自定义兼容的JoypadSpace class JoypadSpace(OriginalJoypadSpace): def reset(self, **kwargs): # 忽略seed等不支持的参数,调用原方法 return super().reset() # 正常初始化环境,使用自定义的JoypadSpace env = gym_super_mario_bros.make('SuperMarioBros-v0',apply_api_compatibility=True,render_mode="human") env = JoypadSpace(env, SIMPLE_MOVEMENT) env = GrayScaleObservation(env,keep_dim=True) env = DummyVecEnv([lambda:env]) env = VecFrameStack(env,4,channels_order='last') state = env.reset()
方案3:升级nes-py到最新版本
检查nes-py是否已修复该兼容性问题,执行升级命令:
pip install --upgrade nes-py
内容的提问来源于stack exchange,提问作者abzd
相关产品推荐
相关产品推荐

