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

Stable Baselines3训练模型与基准策略对比的问题求助

问题解决方案

一、解决BasePolicy调用evaluate_policy的报错

你遇到的TypeError是因为BasePolicy是抽象基类,不能直接将类传入evaluate_policy——该函数需要的是实例化的策略对象,而非类本身。你需要自定义一个符合要求的基准策略(比如随机动作或固定动作策略),实现predict方法。

示例1:随机动作基准策略

import gym
import numpy as np
from stable_baselines3 import SAC
from stable_baselines3.common.policies import BasePolicy
from stable_baselines3.common.evaluation import evaluate_policy

# 自定义随机动作策略
class RandomPolicy(BasePolicy):
    def __init__(self, observation_space, action_space, device="auto"):
        super().__init__(observation_space, action_space, device)
    
    def predict(self, observation, deterministic=False):
        # 生成符合动作空间的随机动作
        return self.action_space.sample(), None

# 主流程
env = gym.make("Pendulum-v1")
env.seed(123456)
model = SAC("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=1000, log_interval=4)

# 评估训练好的模型
reward_list, episode_list = evaluate_policy(model, env, n_eval_episodes=10, return_episode_rewards=True)

# 实例化基准策略并评估
random_policy = RandomPolicy(env.observation_space, env.action_space)
reward_list_base, episode_list_base = evaluate_policy(random_policy, env, n_eval_episodes=10, return_episode_rewards=True)

示例2:固定动作基准策略(无动作/固定输出)

如果需要模拟“无动作”的基准,比如固定输出某个动作(如Pendulum-v1的[0.0]):

class FixedActionPolicy(BasePolicy):
    def __init__(self, observation_space, action_space, device="auto"):
        super().__init__(observation_space, action_space, device)
    
    def predict(self, observation, deterministic=False):
        # 返回固定动作,需匹配环境动作空间的格式
        return np.array([0.0], dtype=np.float32), None

# 实例化使用
fixed_policy = FixedActionPolicy(env.observation_space, env.action_space)
reward_list_base, episode_list_base = evaluate_policy(fixed_policy, env, n_eval_episodes=10, return_episode_rewards=True)

二、解决固定种子后评估奖励仍变化的问题

出现这种情况通常是种子设置不完整,或评估时保留了随机性,可通过以下步骤解决:

  1. 完整设置全局种子
    除了环境种子,还需设置Python、numpy的全局种子,避免隐性随机性:
import random
import numpy as np

# 全局种子统一设置
random.seed(123456)
np.random.seed(123456)
env.seed(123456)
  1. 评估时使用确定性预测
    SAC等算法的predict默认会采样动作(带随机性),评估时需开启确定性模式:
reward_list, episode_list = evaluate_policy(
    model, 
    env, 
    n_eval_episodes=10, 
    return_episode_rewards=True,
    deterministic=True  # 关键参数:使用确定性动作
)
  1. 使用独立的评估环境
    避免复用训练环境(可能残留状态),创建单独的评估环境并设置种子:
eval_env = gym.make("Pendulum-v1")
eval_env.seed(123456)

reward_list, episode_list = evaluate_policy(
    model, 
    eval_env, 
    n_eval_episodes=10, 
    return_episode_rewards=True,
    deterministic=True
)
  1. 指定评估时的种子
    直接通过evaluate_policy的seed参数统一设置评估环境的种子:
reward_list, episode_list = evaluate_policy(
    model, 
    eval_env, 
    n_eval_episodes=10, 
    return_episode_rewards=True,
    deterministic=True,
    seed=123456  # 强制评估时每个episode使用相同种子
)

内容的提问来源于stack exchange,提问作者APaul31

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:01:12