记录智能体¶
在训练期间或评估智能体时,记录智能体在一个 episode (回合) 中的行为并记录累积的总奖励可能很有意义。这可以通过两个 wrappers (包装器) 来实现:RecordEpisodeStatistics
和 RecordVideo
,第一个跟踪 episode (回合) 数据,例如总奖励、episode (回合) 长度和所用时间,第二个使用环境渲染生成智能体的 mp4 视频。
我们展示了如何将这些 wrappers (包装器) 应用于两种类型的问题;第一个用于记录每个 episode (回合) 的数据(通常是评估),第二个用于定期记录数据(用于正常训练)。
记录每个 Episode (回合)¶
给定一个训练好的智能体,您可能希望在评估期间记录几个 episode (回合),以查看智能体的行为方式。下面我们提供了一个示例脚本,使用 RecordEpisodeStatistics
和 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}')
在上面的脚本中,对于 RecordVideo
wrapper (包装器),我们指定了三个不同的变量:video_folder
用于指定应保存视频的文件夹(根据您的问题更改),name_prefix
用于视频本身的前缀,最后是 episode_trigger
,以便记录每个 episode (回合)。这意味着对于环境的每个 episode (回合),都将录制一个视频并以 “cartpole-agent/eval-episode-x.mp4” 的样式保存在其中。
对于 RecordEpisodeStatistics
,我们只需要指定缓冲区长度,这是内部 time_queue
、return_queue
和 length_queue
的最大长度。与其单独收集每个 episode (回合) 的数据,不如使用数据队列在评估结束时打印信息。
为了加速评估环境,可以使用向量环境来实现这一点,以便并行而不是串行地同时评估 N
个 episode (回合)。
在训练期间记录智能体¶
在训练期间,智能体将在数百或数千个 episode (回合) 中执行动作,因此,您无法为每个 episode (回合) 录制视频,但开发人员可能仍然想知道智能体在训练的不同阶段的行为方式,在训练期间定期记录 episode (回合)。虽然对于 episode (回合) 统计数据,了解每个 episode (回合) 的数据更有帮助。以下脚本提供了一个示例,说明如何在记录每个 episode (回合) 统计数据的情况下定期记录智能体的 episode (回合)(我们使用 python 的 logger (日志记录器),但 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()