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

在OpenAI Gym环境中实现DQN时遇输入形状匹配错误

解决DQN在Gym 0.26+中输入形状不匹配的ValueError问题

你遇到的ValueError: Error when checking input: expected flatten_input to have shape (1, 4) but got array with shape (1, 2),核心原因是Gym 0.26+的API变更与强化学习库版本不兼容,导致观测数据被错误处理,同时模型输入形状与记忆模块配置不匹配。以下是针对性解决方案:


1. 替换为兼容的强化学习库

旧版keras-rl不支持Gym 0.20+的新API,必须安装适配的keras-rl2:

pip uninstall keras-rl -y
pip install keras-rl2

2. 包装Gym环境适配旧API

Gym 0.26+的step()方法返回5个值(observation, reward, terminated, truncated, info),但keras-rl2的DQNAgent默认只识别旧版4个返回值(observation, reward, done, info),需要包装环境合并终止状态:

import gym
from gym import Wrapper

class GymCompatWrapper(Wrapper):
    def step(self, action):
        obs, reward, terminated, truncated, info = self.env.step(action)
        done = terminated or truncated
        return obs, reward, done, info

# 替换原有环境初始化代码
env = GymCompatWrapper(gym.make('CartPole-v1', render_mode='human'))

3. 调整模型输入与记忆模块匹配

CartPole的观测本身是一维数组,无需额外Flatten层,直接匹配SequentialMemory(window_length=1)的输入形状即可:

def build_model(states, actions):
    model = Sequential()
    # 直接适配window_length=1的输入形状(1, states)
    model.add(Dense(24, activation='relu', input_shape=(1, states)))
    model.add(Dense(24, activation='relu'))
    model.add(Dense(actions, activation='linear'))
    return model

4. 更新训练参数(适配keras-rl2)

keras-rl2中fit()方法的步数参数已从nb_steps改为steps,修正后训练代码如下:

optimizerr = tf.keras.optimizers.Adam(learning_rate=0.001)
dqn = build_agent(model, actions)
dqn.compile(optimizer=optimizerr, metrics=['mae'])
# 替换nb_steps为steps
dqn.fit(env, steps=50000, visualize=False, verbose=1)

验证关键点

  • 确认states = env.observation_space.shape[0]输出为4(CartPole-v1的标准观测维度)
  • 运行前确保依赖版本正确:python 3.8.0、gym 0.26.2、tensorflow 2.10.0、keras-rl2最新版

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:40:28