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

Keras DQN报错:字典型观测空间形状不匹配问题求助

问题排查与解决方案

报错核心原因

模型期望接收3维输入((None, 1, 10945),其中None为batch维度),但实际传入的观测数组形状为(1, 1),说明观测数据的维度在传递到模型前出现异常,或是模型输入形状定义与框架/环境输出不匹配。


具体排查与修复步骤

1. 确认自定义环境返回的观测形状

在环境的reset()和step()方法中添加打印语句,验证返回的观测形状是否为(10945,):

# 在reset方法中添加
print(f"Reset observation shape: {observation.shape}")
# 在step方法中添加
print(f"Step observation shape: {observation.shape}")

若输出不是(10945,),说明环境未正确展平观测空间,需检查observation_space的定义,并确保返回观测时调用了gym.spaces.utils.flatten(self.observation_space, observation)来处理嵌套空间。

2. 修正模型输入形状的定义

当前模型的Flatten层设置input_shape=(1, 10945),要求每个样本是2维特征数组(加上batch维度后为3维),但Keras-RL的DQN框架默认会自动处理batch维度,且环境返回的是1维特征向量((10945,)),两者不匹配。

修改模型定义,直接适配1维观测向量:

def dqn_model(self):
    self.flat_obs = gym.spaces.utils.flatten_space(self.observation_space)
    # 确认flat_obs.shape[0] == 10945

    model = Sequential()
    # 直接用Dense层接收1维特征向量,无需Flatten层(Dense可自动处理batch+特征的2维输入)
    model.add(Dense(64, input_shape=(self.flat_obs.shape[0],)))
    model.add(Activation('relu'))

    model.add(Dense(32, name="Hidden_layer_1"))
    model.add(Activation('relu'))
    
    model.add(Dense(self.action_space.n, name="Output_Layer"))
    model.add(Activation('softmax'))
    
    model.compile(loss='mse', optimizer=Adam(lr=LEARNING_RATE))

    logger.info(model.summary())
    return model

若必须保留Flatten层,可将其input_shape改为(self.flat_obs.shape[0],),此时Flatten层不会改变输入形状,但能兼容框架的输入处理逻辑。

3. 适配框架的输入预处理逻辑

Keras-RL的DQN会自动将单个观测((10945,))转换为batch形式((1, 10945)),如果坚持使用原模型的3维输入要求,需在环境返回观测时手动添加一个维度:

# 在reset/step返回观测时
observation = gym.spaces.utils.flatten(self.observation_space, observation)
return observation[np.newaxis, :]  # 将(10945,)转为(1, 10945)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:47:43