【问题标题】:Gym Retro/Stable-Baselines Doesn't Stop Iteration After Done Condition Is Met满足完成条件后,Gym Retro/Stable-Baselines 不会停止迭代
【发布时间】:2021-03-11 17:04:56
【问题描述】:

我正在尝试使用 Gym Retro 和 Stable-Baselines 来训练机器人玩超级马里奥兄弟。一切似乎都正常,只是环境似乎并没有真正结束/重置。它录制的BK2文件大小超过500 kb,转换为视频大约需要20分钟,视频时长约为2小时。视频本身以大约三分钟的 AI 游戏开始,但在失去所有三个生命后,它会停留在标题屏幕上,直到演示开始播放。我很确定这个演示会被奖励功能所接受,所以它会干扰训练。我还担心它会大大减慢训练速度,因为它必须经历 2 小时的额外“游戏”。这是我的场景文件的样子:

{
  "done": {
    "condition": "any",
    "variables": {
      "lives": {
        "op": "equal",
        "reference": -1
      },
      "time": {
        "op": "equal",
        "reference": 0
      }
    }
  },
  "reward": {
    "variables": {
        "xscrollHi": {
        "reward": 10
      },
      "playerx": {
        "reward": 0.1
      },
      "coins": {
        "reward": 10
      }
    }
  }
}

我已经使用集成 UI 工具验证了 Done 和 Did-End 变量在满足任一完成条件时切换为 yes。以防万一这里是相关的 Python 代码:

env = DummyVecEnv([lambda: retro.make("SuperMarioBros-Nes", state="Level1-1.state", scenario="training", record="/gdrive/MyDrive/530_project")])
#model = PPO2(CnnPolicy, env, verbose=1)
for i in range(24):
  model = PPO2.load(filePath + "/" + fileName)
  model.set_env(env)
  model.learn(total_timesteps=time_steps, log_interval=1000, reset_num_timesteps=False)
  model.save(filePath + "/" + fileName)
  print("done with iteration ", i)
  del model 

如果您想查看整个 Python 笔记本,请点击以下链接:https://colab.research.google.com/drive/1ThxDqjeNQh3rNEXYqlXJQ6tn3W2TPK7k?usp=sharing

修复这个问题可能不会改变它的训练方式,但至少我希望有更小的 bk2 和 mp4 文件,这样它们更容易处理。任何意见,将不胜感激。如果有更好的地方可以问这个问题,也请告诉我

【问题讨论】:

    标签: python artificial-intelligence reinforcement-learning openai-gym stable-baselines


    【解决方案1】:

    如果有人发现这个问题,我找到了答案。我误解了 total_timesteps 是什么。看起来它实际上是每次运行的时间限制。我已将此设置为关于一个生命的时间用完需要多长时间,以便它有效地工作,但它仍然有点卡顿。

    【讨论】:

      【解决方案2】:

      您无需在每集加载和删除模型。 learn() 中的时间步长对应于在所有情节中学习的总时间步长。 如果你想限制剧集长度 -> 你可以使用gym TimeLimit wrapper。

      您的代码可能如下所示:

      from gym.wrappers.time_limit import TimeLimit
      time_steps = 1000000
      episode_length = 500
      
      env = DummyVecEnv([lambda: TimeLimit('your_mario_env_config...', 
                                            max_episode_steps=episode_length)])
      model = PPO2(CnnPolicy, env, verbose=1)
      model.learn(total_timesteps=time_steps, log_interval=1000, reset_num_timesteps=False)
      model.save(filePath + "/" + fileName)
      

      我们在这里限制了每集 500 步,而整个学习过程大约有 1000000 步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多