记录代理¶
在训练或评估代理时,记录代理在一个回合中的行为并记录累积的总奖励可能是有趣的。这可以通过两个包装器实现::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_queue
、return_queue
和 length_queue
的最大长度。与其单独为每个情节收集数据,我们可以在评估结束时使用数据队列来打印信息。
为了在评估环境时提高速度,可以通过实现向量环境来并行评估 N
个回合,而不是串行评估。
在训练期间记录代理¶
在训练过程中,一个智能体会进行数百或数千次剧集,因此,你不能为每个剧集录制视频,但开发者可能仍然想知道智能体在训练的不同阶段的行为,定期在训练期间录制剧集。对于剧集统计数据,了解每个剧集的数据更有帮助。以下脚本提供了一个示例,说明如何在记录每个剧集的统计数据的同时定期记录智能体的剧集(我们使用Python的记录器,但tensorboard、wandb和其他模块也可用)。
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()