Stable Baselines3训练报错ValueError: too many values to unpack (expected 2)
解决Stable Baselines3训练CartPole时的ValueError问题
错误原因分析
你遇到的ValueError: too many values to unpack (expected 2),核心问题是环境包装方式错误:你先创建了单个gym环境实例,然后让DummyVecEnv的lambda反复返回这个同一个实例,导致环境内部状态混乱,触发解包错误。
具体修复步骤
1. 修正环境包装代码
把原代码中创建和包装环境的两行:
env = gym.make(Environment_name) env = DummyVecEnv([lambda: env])
改成:
env = DummyVecEnv([lambda: gym.make(Environment_name)])
这样DummyVecEnv的每个子环境都是全新的实例,不会出现状态冲突。
2. 自动创建日志目录
原代码只定义了日志路径,但没自动创建目录,加上一行代码确保目录存在:
os.makedirs(log_path, exist_ok=True)
exist_ok=True表示如果目录已经存在,不会报错。
3. (可选)检查依赖版本兼容性
如果修复后仍有问题,可能是gym和stable-baselines3版本不兼容:
- 可以安装兼容版本:
pip install gym==0.25.2 stable-baselines3==1.7.0 - 或者把环境名称改成
CartPole-v1(新版本gym中v0被标记为旧版)。
修复后的完整代码
import os import gym from stable_baselines3 import PPO from stable_baselines3.common.vec_env import DummyVecEnv from stable_baselines3.common.evaluation import evaluate_policy Environment_name = 'CartPole-v0' log_path = os.path.join('Training', 'Logs') # 自动创建日志目录 os.makedirs(log_path, exist_ok=True) # 正确包装环境:每次创建新实例 env = DummyVecEnv([lambda: gym.make(Environment_name)]) model = PPO('MlpPolicy', env, verbose=1, tensorboard_log=log_path) model.learn(total_timesteps=20000)
运行这段代码后,终端应该会输出类似教程里的训练日志,比如每一步的奖励、损失等信息。
内容的提问来源于stack exchange,提问作者Rytro
相关产品推荐
相关产品推荐

