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

