• baselines库中atari_wrappers.py中的环境包装器的顺序问题


    如题:

    在baselines中对atari游戏环境进行包装的代码在atari_wrappers.py模块中,

    def make_atari(env_id, max_episode_steps=None):
        env = gym.make(env_id)
        assert 'NoFrameskip' in env.spec.id
        env = NoopResetEnv(env, noop_max=30)
        env = MaxAndSkipEnv(env, skip=4)
        if max_episode_steps is not None:
            env = TimeLimit(env, max_episode_steps=max_episode_steps)
        return env
    
    
    def wrap_deepmind(env, episode_life=True, clip_rewards=True, frame_stack=False, scale=False):
        """Configure environment for DeepMind-style Atari.
        """
        if episode_life:
            env = EpisodicLifeEnv(env)
        if 'FIRE' in env.unwrapped.get_action_meanings():
            env = FireResetEnv(env)
        env = WarpFrame(env)
        if scale:
            env = ScaledFloatFrame(env)
        if clip_rewards:
            env = ClipRewardEnv(env)
        if frame_stack:
            env = FrameStack(env, 4)
        return env

    baselines库中cmd_util.py模块对atari游戏的包装为什么要分成两部分并在中间加入flatten操作呢? 可以知道在make_atari函数中不对observation进行处理,wrap_deepmind函数对observation进行处理。

    WarpFrame, ScaledFloatFrame, FrameStack, 这三个环境包装类是对observation进行处理包装的。

    其中,WarpFrame要求observation必须是shape为(height, width, channels)的np.array。

    换句话说,warp_deepmind 的observation变量应该为图片类型的np.array 。

    还有一个需要注意的是,warp_deepmind中包装类FireResetEnv是否应该在make_atari函数中的NoopResetEnv前面,根据国外的一些相关文章所指出的,认为应该是将FireResetEnv放在NoopResetEnv前面,修改后的代码为:

    修改后的代码为:

    def make_atari(env_id, max_episode_steps=None):
        env = gym.make(env_id)
        assert 'NoFrameskip' in env.spec.id
        if 'FIRE' in env.unwrapped.get_action_meanings():
            env = FireResetEnv(env)
        env = NoopResetEnv(env, noop_max=30)
        env = MaxAndSkipEnv(env, skip=4)
        if max_episode_steps is not None:
            env = TimeLimit(env, max_episode_steps=max_episode_steps)
        return env
    
    
    def wrap_deepmind(env, episode_life=True, clip_rewards=True, frame_stack=False, scale=False):
        """Configure environment for DeepMind-style Atari.
        """
        if episode_life:
            env = EpisodicLifeEnv(env)
        env = WarpFrame(env)
        if scale:
            env = ScaledFloatFrame(env)
        if clip_rewards:
            env = ClipRewardEnv(env)
        if frame_stack:
            env = FrameStack(env, 4)
        return env

    这样修改的逻辑是,如果一个环境需要Fire button来启动游戏那么在它之前进行NoopResetEnv是没有意义的。

    也就是说,在有fire操作和noop操作同时存在的情况下,最好是先进行fire操作再进行noop操作,在reset过程中fire操作后再进行noop操作。

    ==================================================

  • 相关阅读:
    [MySQL] 联合索引最左前缀原则的原因
    [Go]字符串转int64数值型
    [日常] 浏览器前进后退与数据结构的思想
    [Go] go下实现md5加密
    [PHP] 判断两个数组是否相同
    [Go] goland开启自动格式化和开启go modules
    [PHP] 使用strace排查接口响应速度慢过程
    [Git] git version 2以上git add .和git add -A 一样
    [PHP] 504 Gateway Time-out处理流程
    [GO] go-fly客服系统0.2.2打包编译版下载
  • 原文地址:https://www.cnblogs.com/devilmaycry812839668/p/16125731.html
Copyright © 2020-2023  润新知