如何修改Stable Baselines3日志频率?_log_freq参数无效
Stable Baselines3自定义回调日志频率不生效的解决办法
你定义的TensorboardCallback里只声明了_log_freq参数,但完全没在_on_step里用它做步数判断,自然不会生效。要实现每200步记录一次平均奖励,得给回调加频率判断逻辑和奖励统计逻辑,具体修改如下:
修改后的完整回调代码
from stable_baselines3.common.callbacks import BaseCallback class TensorboardCallback(BaseCallback): def __init__(self, log_freq=200, verbose=0): super().__init__(verbose) self.log_freq = log_freq # 改成可外部传入的参数,方便调整 self.episode_rewards = [] # 用来累计每步奖励,计算平均值 def _on_step(self) -> bool: # 收集当前步的奖励(单环境下取第一个元素即可) current_reward = self.locals['rewards'][0] self.episode_rewards.append(current_reward) # 检查当前步数是否达到日志频率 if self.n_calls % self.log_freq == 0: # 计算这段步数内的平均奖励 avg_reward = sum(self.episode_rewards) / len(self.episode_rewards) # 把平均奖励写入Tensorboard self.logger.record("train/avg_reward", avg_reward) # 清空奖励列表,准备下一轮统计 self.episode_rewards = [] return True
关键修改说明
- 参数可配置:把硬写的
_log_freq改成初始化时可传入的log_freq,训练时直接传200就能生效 - 步数判断:用BaseCallback内置的
self.n_calls(每调用一次_on_step就加1,对应训练的每一步)来判断是否到达日志频率 - 奖励统计:维护
episode_rewards列表累计奖励,到频率时计算平均值再清空,保证每次统计的是最近log_freq步的平均 - 官方日志接口:用
self.logger.record()写入Tensorboard,这是Stable Baselines3推荐的日志方式,能和框架自带的日志兼容
使用示例
训练智能体时把这个回调传进去就行:
from stable_baselines3 import PPO # 初始化模型 model = PPO("MlpPolicy", "CartPole-v1", verbose=1, tensorboard_log="./ppo_logs/") # 传入回调,设置每200步记录一次 model.learn(total_timesteps=50000, callback=TensorboardCallback(log_freq=200))
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

