我注意到,基类Env
(来自健身房)包含一个名为metadata
的类字段。该字段似乎用于指定如何呈现环境。例如,对于FrozenLake环境,metadata
被定义为
metadata = {'render.modes': ['human', 'ansi']}
但是,该属性/字段metadata
从未在该文件中使用。例如,在同一示例中,render
method有一个参数,您可以在其中指定渲染模式(render
方法甚至不检查传递给该参数的值是否在{{1 }}类字段),所以我不确定为什么需要这个metadata
字段。
那么,为什么我们需要字段metadata
?它是否用于指定环境的呈现“模式”以外的其他用途?如果是,在哪里?
答案 0 :(得分:0)
我会尽量保持基础。
我进行了一些试验,据我所知,渲染器有两种模式,human
和ansi
处理控制台上的输出。(随附的是控制台的屏幕截图)。在人工模式(默认设置)下,输出将为SFFF,FHFH,带有当前观察的颜色标签(对人类友好)...等,在ansi模式下,您将输出 bytes-like 不执行编码,解码或换行翻译的对象,例如\ nSFFF \ n \ x1b [41mF \ x1b [0mHFH]。
答案 1 :(得分:0)
首先,我不是 OpenAir 健身房存储库的维护者/贡献者。因此,下面的所有内容都来自我自己的调查,因为我想知道同样的事情。因此,OpenAi Gym 团队有其他原因包含元数据属性,而不是我在下面写的那些。
metadata
属性描述了一些关于健身房环境类的额外信息,这些信息在训练期间不需要,但在执行时很有用:
首先要注意的是(在大多数环境中)metadata
属性是在类构造函数之前定义的。这意味着它是一个在类的所有实例之间共享的 class attribute。这样做是因为它不打算在训练期间使用,而是存储有关环境类的一些附加信息,可用于其他测试或健身房实用程序(这就是它被称为 META 数据的原因)。
我认为可以通过深入了解代码库并检查元数据的使用位置来了解这一点。在搜索代码时,我们可以看到 the frozen lake environment metadata 用在了两个地方:
此处在 gym/envs/tests/test_env.py 脚本中使用 render.modes
元数据来测试给定环境中所有可能的渲染方法是否按预期工作:
for mode in env.metadata.get('render.modes', []):
env.render(mode=mode)
第二个使用 render.modes
元数据的地方是 gym/wrappers/monitoring/video_recorder.py。这里用来检查gym环境是否有渲染模式,可以用录像机录制。
if 'rgb_array' not in modes:
if 'ansi' in modes:
self.ansi_mode = True
else:
logger.info('Disabling video recorder because {} neither supports video mode "rgb_array" nor "ansi".'.format(env))
# Whoops, turns out we shouldn't be enabled after all
self.enabled = False
return
此处使用的另一个元数据示例是 video.frames_per_second
元数据。
如上所述,在大多数环境中,元数据被定义为类属性。通过这样做,我们可以确保如果在其中一个实例上更改了属性,则所有其他实例也会知道此更改。例如,当您想同时使用 MPI 在 multiple parallel gym environments 上训练代理时,这会很方便。例如,您可以一次更新所有实例的频率。
从上面的调查来看,我认为元数据存储了关于健身房环境类的额外信息,在训练期间不使用,但例如可以在以下期间使用:
当然,您也可以将相同的信息作为单独的属性存储在实例上,但我认为由于在训练期间不使用,将其存储为 metadata
类属性更正确。