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)
二、解决固定种子后评估奖励仍变化的问题
出现这种情况通常是种子设置不完整,或评估时保留了随机性,可通过以下步骤解决:
- 完整设置全局种子
除了环境种子,还需设置Python、numpy的全局种子,避免隐性随机性:
import random import numpy as np # 全局种子统一设置 random.seed(123456) np.random.seed(123456) env.seed(123456)
- 评估时使用确定性预测
SAC等算法的predict默认会采样动作(带随机性),评估时需开启确定性模式:
reward_list, episode_list = evaluate_policy( model, env, n_eval_episodes=10, return_episode_rewards=True, deterministic=True # 关键参数:使用确定性动作 )
- 使用独立的评估环境
避免复用训练环境(可能残留状态),创建单独的评估环境并设置种子:
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 )
- 指定评估时的种子
直接通过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
相关产品推荐
相关产品推荐

