Gym模块学习笔记(Ⅲ)——Rita_Aloha

一、装饰器

装饰器是一种修改现有环境的便捷方式,无需直接修改底层代码。使用装饰器将允许您避免大量样板代码,并使您的环境更加模块化。装饰器也可以被链接起来根据效果组合使用。情况下,通过gym.make生成的大多数环境都默认已被包装。

为了打包环境,必须首先初始化一个基本环境。然后,可以将此环境及(可选的)参数传递给装饰器的构造函数。您可以使用.env属性访问第一个装饰器下的环境。

如果您想进入所有装饰层下面的那个环境,可以使用.unwrapped属性。如果环境已经是一个裸环境,那么.unwrapped属性将只返回自身。

装饰器三个常见的用法:

  • 在将动作应用于基础环境之前对其进行转换
  • 转换基本环境返回的观察值
  • 转换基础环境返回的奖励

通过继承ActionWrapper、ObservationWrapper和RewardWrapper或分别转换,可以实现这些装饰器。如果需要装饰器来执行更复杂的任务,可以直接从Wrapper类继承。

1.ActionWrapper

如果希望在动作传递到基本环境之前对该动作应用函数,只需从ActionWrapper继承并重写action方法即可实现该转换。由该方法定义的转换必须取值于基本环境的动作空间。但是,它的域可能不同于原始的动作空间。在这种情况下,需要通过在装饰器的__init__方法中设置self._action_space来指定装饰器的新动作空间。除此之外,Gym还提供动作装饰器ClipActionRescaleAction

2.ObservationWrapper

如果希望在将基本环境返回的结果传递给学习代码之前对该观察结果应用函数,只需从ObservationWrapper继承并重写observation方法即可实现该转换。该转换必须由基础环境的观察空间定义。但是,它可能会在不同的空间中获取值。在这种情况下,需要通过在装饰器的__init__方法中设置self._observation_space来为装饰器指定新的观察空间。其中,Gym提供了观察装饰器TimeAwareObservation,它将有关时间步索引的信息添加到观察中。

3.RewardWrapper

如果希望在将基本环境返回的奖励传递给学习代码之前对该奖励结果应用函数,只需从RewardWrapper继承并重写奖励方法即可实现该转换。这种转变可能会改变奖励范围;要指定装饰器的奖励范围,只需在_init__中定义self._reward_range即可。

4.自动复位装饰器

有时希望当被装饰环境达到done状态时,装饰器能自动重置环境。这种环境的一个优点是,当越过done状态时,永远不会像标准Gym环境那样产生未定义的行为。

当调用step使self.env.step()返回done=True时,调用self.env.reset(),返回的self.step()格式如下:

new_obs, terminal_reward, terminal_done, info

new_obs 是调用self.env.reset()的首次观察,

terminal_reward是调用self.env.step()后的奖励, 优先于调用 self.env.reset(),

terminal_done 总是 True

info 是一个dict,其中包含调用self.env.reset()返回的info dict的所有键(keys)。额外的,terminal_observation包含最后一次调用self.env.step()返回的观察值,terminal_info包含最后一次调用self.env.step()返回的info dict。

如果在调用self.env.step()done不是true,则self.step()会像正常情况一样返回:

obs, reward, done, info

在调用gym.make()时,默认情况下不会应用AutoResetRapper,但是可以通过将可选的autoreset参数设置为True来应用AutoResetRapper。AutoResetRapper也可以使用其构造函数应用。

当使用AutoResetWrapper收集卷展时,请注意,当self.env.step()返回“done”时,调用self.env.reset()self.step()会返回一个新的观察结果,该观察结果延续自的前一集(episode)的“终端奖励和done”状态。如果你需要上一集的终端状态,你需要通过info dict中的terminal_observation键来检索它。

5.General Wrappers

有时,可能希望使用装饰器实现更加复杂的修改(例如,根据信息中的数据修改奖励或更改渲染行为)。这样的装饰器可以通过从Wrapper类继承。

  • 通过在__init__中分别定义self._action_spaceself._observation_space来设置新的操作或观察空间

  • 通过在__init__中分别定义self._metadataself._reward_range,可以设置新的元数据和奖励范围

  • 也可以覆盖step、render、close等。为此,可以通过访问属性self.env来访问传递给装饰器的环境(该装饰器仍然有可能被打包在其他装饰器中)。

6.Available Wrappers

Name

Type

Arguments

Description

AtariPreprocessing

gym.Wrapper

env: gym.Env, noop_max: int = 30,

frame_skip: int = 4,

screen_size: int = 84,

terminal_on_life_loss: bool = False,

grayscale_obs: bool = True,

grayscale_newaxis: bool = False,

scale_obs: bool = False

Implements the best practices from Machado et al. (2018),

AutoResetWrapper

gym.Wrapper

env

当达到“done”状态时,打包环境将自动重置。在使用此装饰器之前,请务必阅读文档!

ClipAction

gym.ActionWrapper

env

将连续操作剪裁到环境的action_space指定的有效范围

FilterObservation

gym.ObservationWrapper

env, filter_keys=None

如果有一个将字典数据作为观察结果返回的环境,但只希望保留条目的子集,那么可以使用此装饰器。filter_keys应该是可迭代的,其中包含保存在新观察中的键。如果没有,则保留所有keys,且装饰器无效

FlattenObservation

gym.ObservationWrapper

env

观察装饰器,flattens the observation

FrameStack

gym.ObservationWrapper

env, num_stack, lz4_compress=False

以滚动方式堆叠观察结果的观察装饰器。观察对象将是LazyFrames类型的对象。此对象可以通过np.asarray(obs)转换为numpy数组。还可以通过常用的__getitem__语法访问单个帧或片段。如果lz4_compress设置为true,LazyFrames对象将在内部(无损)压缩帧。第一次观测(即重置返回的观测)将由第一帧的num_stack表示组成。

GrayScaleObservation

gym.ObservationWrapper

env, keep_dim=False

将图像观察值从RGB转换为灰度。默认情况下,生成的观察结果是二维的。如果keep_dim设置为true,将添加一个单态维度(即观察值的形状为AxBx1)。

NormalizeReward

gym.Wrapper

env, gamma=0.99, epsilon=1e-8

这个装饰使即时奖励标准化(例如,指数移动平均值有固定的方差)。epsilon是一个稳定性参数,gamma是指数移动平均中使用的贴现因子。指数移动平均值的方差(1 - gamma)**2。标度取决于过去的轨迹,如果装饰器是新实例化的,或者最近更改了策略,则奖励将无法正确标准化。

NormalizeObservation

gym.Wrapper

env, epsilon=1e-8

这个包装饰将观察结果标准化(例如,每个坐标都以单位方差为中心)。标准化取决于过去的轨迹,如果装饰器是新实例化的,或者策略是最近更改的,则观察结果将无法正确标准化。epsilon是一个稳定性参数,用于标度观测值。

OrderEnforcing

gym.Wrapper

env

如果在初始reset之前调用step ,则会产生错误

PixelObservationWrapper

gym.ObservationWrapper

env, pixels_only=True, render_kwargs=None, pixel_keys=("pixels",)

通过render获得的像素值来增加观测值。可以指定是完全放弃原始观测值,还是通过设置pixels_only来扩大原始观测值。此外,还可以为render提供关键字参数。

RecordEpisodeStatistics

gym.Wrapper

env, deque_size=100

记录累积奖励和脚本(episode)长度。在一集结束时,该集的统计信息将添加到info中。此外,奖励和脚本长度存储在可分别通过wrapped_env.return_queuewrapped_env.length_queue访问的缓冲区中。这些缓冲区的大小可以通过deque_size设置。

RecordVideo

gym.Wrapper

env, video_folder: str,

episode_trigger: Callable[[int], bool] = None,

step_trigger: Callable[[int], bool] = None,

video_length: int = 0,

name_prefix: str = "rl-video"

This wrapper will record videos of rollouts. The results will be saved in the folder specified via video_folder. You can specify a prefix for the filenames via name_prefix. Usually, you only want to record the environment intermittently, say every hundreth episode. To allow this, you can pass episode_trigger or step_trigger. At most one of these should be passed. These functions will accept an episode index or step index, respectively. They should return此装饰器将录制卷展的视频。结果将保存在通过video_folder指定的文件夹中。可以通过name_prefix为文件名指定前缀。只想断断续续地记录环境,可以通过episode_triggerstep_trigger。最多应该通过其中一项。这些函数将分别接受episode索引或step索引。它们应该返回一个布尔值,指示此时是否应开始录制。如果episode_triggerstep_trigger均未有,则将使用默认episode_trigger。默认情况下,一旦环境发出done信号,记录将停止。但是,通过为video_length传递一个严格的正值,也可以创建固定长度的录音(可能跨越几集)。

RescaleAction

gym.ActionWrapper

env, min_action, max_action

将环境的连续动作空间重新缩放到一个范围[min_action, max_action],其中min_actionmax_action是numpy数组或浮点数。

ResizeObservation

gym.ObservationWrapper

env, shape

此装饰器适用于具有图像观察(或更一般地说是形状AxBxC的观察)的环境,并将观察调整为元组shape给定的形状。参数shape也可以是整数。在这种情况下,观测值被缩放为边长shape的平方

TimeAwareObservation

gym.ObservationWrapper

env

使用trajectory中的当前的时间步长(通过将其附加到观测值中)增加观测值。这有助于一切stay Markov。目前它只适用于一维观测空间。

TimeLimit

gym.Wrapper

env, max_episode_steps=None

也许是Gym里最有用的装饰器。如果在一集中超过指定的步数,该装饰器将发出一个done信号。为了能够区分终止和截断,您需要检查info。如果它不包含键“TimeLimit.truncated”,则环境未达到TimeLimit。否则,如果由于时间限制而终止该集,则info["TimeLimit.truncated"]将为true。

TransformObservation

gym.ObservationWrapper

env, f

这个包装将f函数作用于观察

TransformReward

gym.RewardWrapper

env, f

这个包装将f函数作用于奖励

Wrappers - Gym Documentationhttps://www.gymlibrary.ml/content/wrappers/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值