在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
相关产品推荐
相关产品推荐

