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

SB3组合vec_env与AtariWrapper报AttributeError问题求助

问题:Stable Baselines 3中vec_env与AtariWrapper结合报错AttributeError

在尝试将Stable Baselines 3(SB3)的向量环境(vec_env)与AtariWrapper结合使用时,触发如下错误:

AttributeError: 'DummyVecEnv' object has no attribute 'get_action_meanings'

报错代码

import gymnasium as gym

from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
from stable_baselines3.common.atari_wrappers import AtariWrapper

# Parallel environments
# vec_env = gym.make("PongNoFrameskip-v4")
vec_env = make_vec_env("PongNoFrameskip-v4", n_envs=2, seed=3)
vec_env = AtariWrapper(vec_env)
model = PPO("CnnPolicy", vec_env, verbose=1, n_steps=128, n_epochs=4,
            batch_size=256, learning_rate=2.5e-4, clip_range=0.1,
            vf_coef=0.5, ent_coef=0.01)
model.learn(total_timesteps=1e7)
model.save("ppo_cartpole")

完整报错信息

A.L.E: Arcade Learning Environment (version 0.8.1+53f58b7)
[Powered by Stella]
Traceback (most recent call last):
  File "D:\q_learning\sb3_ppo.py", line 10, in <module>
    vec_env = AtariWrapper(vec_env)
  File "C:\Users\thoma\anaconda3\envs\torch_2\lib\site-packages\stable_baselines3\common\atari_wrappers.py", line 294, in __init__
    env = NoopResetEnv(env, noop_max=noop_max)
  File "C:\Users\thoma\anaconda3\envs\torch_2\lib\site-packages\stable_baselines3\common\atari_wrappers.py", line 57, in __init__
    assert env.unwrapped.get_action_meanings()[0] == "NOOP"  # type: ignore[attr-defined]
AttributeError: 'DummyVecEnv' object has no attribute 'get_action_meanings'

Process finished with exit code 1

可正常运行的代码(未使用向量环境)

vec_env = gym.make("PongNoFrameskip-v4")
# vec_env = make_vec_env("PongNoFrameskip-v4", n_envs=2, seed=3)
vec_env = AtariWrapper(vec_env)
model = PPO("CnnPolicy", vec_env, verbose=1, n_steps=128, n_epochs=4,
            batch_size=256, learning_rate=2.5e-4, clip_range=0.1,
            vf_coef=0.5, ent_coef=0.01)
model.learn(total_timesteps=1e7)
model.save("ppo_cartpole")

原因分析

AtariWrapper是为单个Atari环境设计的,初始化时会调用环境的get_action_meanings()方法验证NOOP动作存在。但make_vec_env创建的DummyVecEnv是向量环境容器,本身没有这个方法——真正的Atari环境是向量环境内部的子环境,直接给向量环境套AtariWrapper自然会报错。

解决方法

正确的做法是给每个子环境单独应用AtariWrapper,而非给整个向量环境加Wrapper。有两种常用实现方式:

方式一:使用make_vec_env的wrapper_class参数

直接通过wrapper_class指定要给每个子环境应用的Wrapper:

import gymnasium as gym

from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
from stable_baselines3.common.atari_wrappers import AtariWrapper

# 给每个子环境自动应用AtariWrapper
vec_env = make_vec_env("PongNoFrameskip-v4", n_envs=2, seed=3, wrapper_class=AtariWrapper)
model = PPO("CnnPolicy", vec_env, verbose=1, n_steps=128, n_epochs=4,
            batch_size=256, learning_rate=2.5e-4, clip_range=0.1,
            vf_coef=0.5, ent_coef=0.01)
model.learn(total_timesteps=1e7)
model.save("ppo_pong")

方式二:自定义环境生成函数

如果需要组合多个Wrapper,可以自定义生成环境的函数,再传给make_vec_env:

import gymnasium as gym

from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
from stable_baselines3.common.atari_wrappers import AtariWrapper

def make_custom_atari_env(env_id, seed):
    env = gym.make(env_id)
    # 这里可以添加多个Wrapper,比如先加AtariWrapper再自定义其他Wrapper
    env = AtariWrapper(env)
    env.seed(seed)
    return env

vec_env = make_vec_env(make_custom_atari_env, env_id="PongNoFrameskip-v4", n_envs=2, seed=3)
model = PPO("CnnPolicy", vec_env, verbose=1, n_steps=128, n_epochs=4,
            batch_size=256, learning_rate=2.5e-4, clip_range=0.1,
            vf_coef=0.5, ent_coef=0.01)
model.learn(total_timesteps=1e7)
model.save("ppo_pong")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:05:38