记录代理

在训练或评估代理时,记录代理在一个回合中的行为并记录累积的总奖励可能是有趣的。这可以通过两个包装器实现::class:RecordEpisodeStatistics 和 :class:RecordVideo,前者跟踪回合数据,如总奖励、回合长度和所用时间,后者使用环境的渲染生成代理的mp4视频。

我们展示了如何将这些包装器应用于两种类型的问题;第一种是记录每个剧集的数据(通常用于评估),第二种是定期记录数据(用于正常训练)。

记录每一集

给定一个训练好的智能体,你可能希望在评估期间记录几个回合,以查看智能体的行为。下面我们提供了一个示例脚本来使用 :class:RecordEpisodeStatistics 和 :class:RecordVideo 完成此操作。

import gymnasium as gym
from gymnasium.wrappers import RecordEpisodeStatistics, RecordVideo

num_eval_episodes = 4

env = gym.make("CartPole-v1", render_mode="rgb_array")  # replace with your environment
env = RecordVideo(env, video_folder="cartpole-agent", name_prefix="eval",
                  episode_trigger=lambda x: True)
env = RecordEpisodeStatistics(env, buffer_length=num_eval_episodes)

for episode_num in range(num_eval_episodes):
    obs, info = env.reset()

    episode_over = False
    while not episode_over:
        action = env.action_space.sample()  # replace with actual agent
        obs, reward, terminated, truncated, info = env.step(action)

        episode_over = terminated or truncated
env.close()

print(f'Episode time taken: {env.time_queue}')
print(f'Episode total rewards: {env.return_queue}')
print(f'Episode lengths: {env.length_queue}')

在上面的脚本中,对于 :class:RecordVideo 包装器,我们指定了三个不同的变量:video_folder 用于指定应保存视频的文件夹(根据你的问题进行更改),name_prefix 用于视频的前缀,最后是一个 episode_trigger,以便每个剧集都被记录。这意味着对于环境的每个剧集,都会记录并保存一个视频,格式为“cartpole-agent/eval-episode-x.mp4”。

对于 :class:RecordEpisodicStatistics,我们只需要指定缓冲区长度,这是内部 time_queuereturn_queuelength_queue 的最大长度。与其单独为每个情节收集数据,我们可以在评估结束时使用数据队列来打印信息。

为了在评估环境时提高速度,可以通过实现向量环境来并行评估 N 个回合,而不是串行评估。

在训练期间记录代理

在训练过程中,一个智能体会进行数百或数千次剧集,因此,你不能为每个剧集录制视频,但开发者可能仍然想知道智能体在训练的不同阶段的行为,定期在训练期间录制剧集。对于剧集统计数据,了解每个剧集的数据更有帮助。以下脚本提供了一个示例,说明如何在记录每个剧集的统计数据的同时定期记录智能体的剧集(我们使用Python的记录器,但tensorboardwandb和其他模块也可用)。

import logging

import gymnasium as gym
from gymnasium.wrappers import RecordEpisodeStatistics, RecordVideo

training_period = 250  # record the agent's episode every 250
num_training_episodes = 10_000  # total number of training episodes

env = gym.make("CartPole-v1", render_mode="rgb_array")  # replace with your environment
env = RecordVideo(env, video_folder="cartpole-agent", name_prefix="training",
                  episode_trigger=lambda x: x % training_period == 0)
env = RecordEpisodeStatistics(env)

for episode_num in range(num_training_episodes):
    obs, info = env.reset()

    episode_over = False
    while not episode_over:
        action = env.action_space.sample()  # replace with actual agent
        obs, reward, terminated, truncated, info = env.step(action)

        episode_over = terminated or truncated

    logging.info(f"episode-{episode_num}", info["episode"])
env.close()

更多信息