DQN初始化报错:模型输出形状与动作空间维度不匹配如何解决
错误原因
你遇到的报错核心来自两个不匹配问题:
- Keras-RL的
DQNAgent的nb_actions参数要求传入总动作数量的整数值,你当前传入的(1,2,1,0)是动作维度元组,不符合参数要求。 - DQN模型输出维度需要和总动作数一一对应,用于输出每个动作对应的Q值,你当前模型最后一层输出维度为4,和动作空间总数量不匹配。
报错原文:
ValueError: Model output "Tensor("dense_16/Relu:0", shape=(?, 4), dtype=float32)" has invalid shape. DQN expects a model that has one dimension for each action, in this case (1, 2, 1, 0)
修复方案
方案1:单DQN处理所有智能体动作(动作扁平化)
你当前的动作空间为4个智能体各有3个离散动作,总动作数为3*4=12,按以下步骤修改代码:
- 调整模型构建函数,修正输入维度(DQN输入为状态,不是动作),并把输出层维度改为总动作数:
def build_model(states, actions): model = Sequential() # input_shape对应状态维度,替换为你的状态向量长度 model.add(Dense(4, activation='relu', input_shape=[len(states)])) model.add(Dense(4, activation='relu')) # 输出层维度等于总动作数,用线性激活输出Q值 model.add(Dense(12, activation='linear')) return model
- 调整智能体构建函数的入参,传入整数类型的总动作数:
def build_agent(model, total_actions): policy = BoltzmannQPolicy() memory = SequentialMemory(limit=50000, window_length=1) dqn = DQNAgent(model=model, memory=memory, policy=policy, nb_actions=total_actions, nb_steps_warmup=10, target_model_update=1e-2) return dqn # 调用时传入总动作数 dqn = build_agent(model, 12)
方案2:多智能体独立训练DQN
如果需要每个智能体单独训练,不需要动作扁平化,就为每个智能体单独构建模型和Agent,单个Agent的nb_actions设为3,对应单个智能体的Discrete(3)动作空间即可。
内容的提问来源于stack exchange,提问作者Michele Raso
相关产品推荐
相关产品推荐

