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

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,按以下步骤修改代码:

  1. 调整模型构建函数,修正输入维度(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
  1. 调整智能体构建函数的入参,传入整数类型的总动作数:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:57:03