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

为什么DQNAgent.fit会为输入数据增加额外维度引发形状不匹配?

问题根因与修复方案

错误触发的核心原因

  • Keras生态的DQN代理(keras-rl/keras-rl2版本默认逻辑)会自动给输入状态插入时序窗口维度:默认窗口长度为1的场景下,环境返回的形状为(65,)的单步状态,会先被拼接为(1, 65)的窗口格式,再叠加批处理维度,最终传入模型的张量形状为(1, 1, 65)。
  • 模型输入形状和实际传入张量维度不匹配:你定义的模型输入层input_shape=states对应input_shape=(65,),预期接收的是2维张量(batch_size, 65),但实际传入的是3维张量,因此触发维度校验失败。

修复方案

方案1:调整模型适配窗口维度

在输入层后新增Flatten层压缩多余的窗口维度,修改后的模型代码如下:

def build_model(states, actions):
    model = Sequential()    
    # 调整输入形状匹配带窗口维度的输入
    model.add(Dense(100, activation='relu', input_shape=(1,) + states))
    # 压缩窗口维度,输出形状为(batch_size, 100)适配后续全连接层
    model.add(Flatten())
    model.add(Dense(200, activation='relu'))
    model.add(Dense(actions, activation='linear'))
    return model

方案2:关闭时序窗口扩展

初始化DQNAgent时显式关闭窗口扩展逻辑,代理不会额外新增维度,原有模型无需修改即可使用:

dqn = DQNAgent(
    model=model,
    nb_actions=actions,
    memory=memory,
    # 其余参数保持原有配置
    enable_windowing=False # 关闭自动窗口扩展
)

额外注意事项

你当前使用Tuple类型的动作空间不属于Keras-RL原生DQNAgent的支持范围,将动作映射为64*64个离散动作的处理逻辑可行,但需要在环境的step方法中,提前把代理输出的单个离散动作拆解为两个独立的离散值,再执行后续环境逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 17:54:03