记录智能体

在训练期间或评估智能体时,记录智能体在一个 episode (回合) 中的行为并记录累积的总奖励可能很有意义。这可以通过两个 wrappers (包装器) 来实现:RecordEpisodeStatisticsRecordVideo,第一个跟踪 episode (回合) 数据,例如总奖励、episode (回合) 长度和所用时间,第二个使用环境渲染生成智能体的 mp4 视频。

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

记录每个 Episode (回合)

给定一个训练好的智能体,您可能希望在评估期间记录几个 episode (回合),以查看智能体的行为方式。下面我们提供了一个示例脚本,使用 RecordEpisodeStatisticsRecordVideo 来完成此操作。

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}')

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

对于 RecordEpisodeStatistics,我们只需要指定缓冲区长度,这是内部 time_queuereturn_queuelength_queue 的最大长度。与其单独收集每个 episode (回合) 的数据,不如使用数据队列在评估结束时打印信息。

为了加速评估环境,可以使用向量环境来实现这一点,以便并行而不是串行地同时评估 N 个 episode (回合)。

在训练期间记录智能体

在训练期间,智能体将在数百或数千个 episode (回合) 中执行动作,因此,您无法为每个 episode (回合) 录制视频,但开发人员可能仍然想知道智能体在训练的不同阶段的行为方式,在训练期间定期记录 episode (回合)。虽然对于 episode (回合) 统计数据,了解每个 episode (回合) 的数据更有帮助。以下脚本提供了一个示例,说明如何在记录每个 episode (回合) 统计数据的情况下定期记录智能体的 episode (回合)(我们使用 python 的 logger (日志记录器),但 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()

更多信息