Windows 10环境下OpenAI Gym Atari运行异常问题求助
解决Atari环境的两个常见问题:无画面与运行停止
问题1:Karpathy的Pong代码无游戏画面
Karpathy的原始Pong代码为了提升训练速度,默认是不启用画面渲染的,再加上新版本Gym(或Gymnasium)的接口变化,很容易出现看不到画面的情况。你可以按以下步骤调整:
添加渲染调用:在训练循环的
env.step()之后,插入一行env.render('human'),这样每一步都会渲染游戏画面。示例修改:# 找到训练循环里的step部分,修改为: observation, reward, done, info = env.step(action) env.render('human') # 新增这行开启画面渲染适配新版Gym接口:如果你用的是Gymnasium(新版Gym),创建环境时需要显式指定
render_mode='human',否则默认是无头(无画面)模式:env = gym.make("Pong-v0", render_mode="human")训练时可选渲染:如果觉得训练时渲染拖慢速度,可以只在测试模型的时候开启渲染——单独写一段测试代码,加载训练好的权重,然后循环执行动作并渲染即可。
问题2:SpaceInvaders测试代码运行30秒就停止
这个问题是因为你没处理游戏的终止状态:当游戏里玩家的生命值耗尽,环境会返回done=True(新版Gym是terminated或truncated),此时如果不重置环境,后续的step调用不会继续渲染,甚至会抛出错误。修改代码如下:
import gym # 新版Gym需要指定render_mode,旧版可省略该参数 env = gym.make('SpaceInvaders-v0', render_mode='human') done = False while True: # 游戏结束时自动重置环境 if done: env.reset() # 随机采样动作 action = env.action_space.sample() # 新版Gym返回5个值,旧版是4个,按需调整解构语句 obs, reward, terminated, truncated, info = env.step(action) # 只要terminated或truncated任一为True,就标记游戏结束 done = terminated or truncated env.render()
这样游戏结束后会自动重置,就能持续运行下去了。如果用的是旧版Gym,step返回的是4个值(obs, reward, done, info),把解构语句改成对应的格式即可。
内容的提问来源于stack exchange,提问作者LucDaoDaiNhan
相关产品推荐
相关产品推荐

