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

自定义Gym环境训练PPO模型时遇AttributeError问题求助

问题排查与解决方法

1. 核心错误原因:环境未正确实例化

你触发的'function' object has no attribute 'unwrapped'错误,大概率是因为传入PPO的env是环境类(shower)而非实例化后的对象(shower())。必须先创建环境实例再传入模型:

env = shower()  # 实例化自定义环境
model = PPO("MlpPolicy", env, verbose=1, tensorboard_log=log_path)

2. 修正自定义环境的规范问题

你的shower类存在多处不符合Stable Baselines3要求的细节,逐一修正:

(1)修正属性名大小写

框架要求环境必须包含**小写的action_space和observation_space**属性,你当前写的Action_Space(大写A)无法被识别,改为:

self.action_space = Discrete(3)  # 改为小写action_space
self.observation_space = Box(low=0, high=100, shape=(1,), dtype=np.float32)

(2)统一状态的数组类型

__init__中初始化的self.state是整数,而reset返回的是numpy数组,会导致状态类型不一致。修改__init__中的状态初始化:

self.state = np.array([38 + random.randint(-3, 3)], dtype=np.float32)

同时step方法中保持状态为数组类型:

self.state += (action - 1)  # 数组直接做元素运算

(3)添加状态边界裁剪(可选但推荐)

为避免状态超出observation_space的范围,在step中添加裁剪逻辑:

self.state = np.clip(self.state, self.observation_space.low, self.observation_space.high)

(4)修正后的完整环境代码

import numpy as np
import random
from gym import spaces

class shower:
    def __init__(self):
        self.action_space = spaces.Discrete(3)
        self.observation_space = spaces.Box(low=0, high=100, shape=(1,), dtype=np.float32)
        
        self.state = np.array([38 + random.randint(-3, 3)], dtype=np.float32)
        self.shower_length = 60
    
    def step(self, action):
        self.state += (action - 1)
        self.shower_length -= 1
        
        self.state = np.clip(self.state, self.observation_space.low, self.observation_space.high)
        
        reward = 1 if 37 <= self.state[0] <= 39 else -1
        done = self.shower_length <= 0
        info = {}
        
        return self.state, reward, done, info
        
    def render(self):
        pass
    
    def reset(self):
        self.state = np.array([38 + random.randint(-3, 3)], dtype=np.float32)
        self.shower_length = 60
        return self.state

3. 验证环境合规性

用Stable Baselines3自带工具检查环境是否符合规范,避免隐藏问题:

from stable_baselines3.common.env_checker import check_env

env = shower()
check_env(env)  # 无报错则说明环境符合要求

4. 重新训练模型

验证通过后,即可正常初始化并训练PPO模型:

log_path = "./ppo_shower_logs/"
model = PPO("MlpPolicy", env, verbose=1, tensorboard_log=log_path)
model.learn(total_timesteps=100000)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:05:31