You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

关键修改说明

  1. 参数可配置:把硬写的_log_freq改成初始化时可传入的log_freq,训练时直接传200就能生效
  2. 步数判断:用BaseCallback内置的self.n_calls(每调用一次_on_step就加1,对应训练的每一步)来判断是否到达日志频率
  3. 奖励统计:维护episode_rewards列表累计奖励,到频率时计算平均值再清空,保证每次统计的是最近log_freq步的平均
  4. 官方日志接口:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:42:18