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

多输入DQN批量训练时遇输入张量数量不匹配错误求助

DQN批量训练报错解决方案:输入张量数量不匹配

错误原因

这个报错的核心是批量输入的结构不符合模型定义:你的DQN模型明确需要3个输入分支,但修改后的代码把批量数据拆成了96个独立张量(比如批量大小为32时,3个输入×32单样本就会变成96个张量),导致模型无法识别输入结构。

正确批量实现方式

假设你的DQN模型有3个输入分支:状态输入、特征输入1、特征输入2,以下是调整后的批量训练逻辑:

1. 批量数据预处理

从经验回放池采样后,按输入类型拆分并堆叠成批量张量,而非保留单样本列表:

import numpy as np
import random

# 假设经验回放池存储格式:(state, feat1, feat2, action, reward, next_state, next_feat1, next_feat2, done)
batch_size = 32
samples = random.sample(replay_buffer, batch_size)

# 按输入类型拆分并堆叠成批量张量
states = np.array([s[0] for s in samples])
feat1s = np.array([s[1] for s in samples])
feat2s = np.array([s[2] for s in samples])
next_states = np.array([s[5] for s in samples])
next_feat1s = np.array([s[6] for s in samples])
next_feat2s = np.array([s[7] for s in samples])

2. 批量预测Q值

将3个批量张量组成列表传入predict(),而非传入扁平化的单样本集合:

# 批量预测当前Q值与目标Q值
current_q_values = model.predict([states, feat1s, feat2s], batch_size=batch_size)
next_q_values = target_model.predict([next_states, next_feat1s, next_feat2s], batch_size=batch_size)

3. 批量更新模型

计算目标Q值后,同样以3个批量张量作为输入传入fit():

gamma = 0.99  # 折扣因子
rewards = np.array([s[3] for s in samples])
actions = np.array([s[4] for s in samples])
dones = np.array([s[8] for s in samples])

# 计算目标Q值(DQN经典更新逻辑)
target_q_values = current_q_values.copy()
for i in range(batch_size):
    if dones[i]:
        target_q_values[i][actions[i]] = rewards[i]
    else:
        target_q_values[i][actions[i]] = rewards[i] + gamma * np.max(next_q_values[i])

# 批量训练:输入为3个张量的列表,标签为目标Q值
model.fit([states, feat1s, feat2s], target_q_values, batch_size=batch_size, epochs=1, verbose=0)

4. 关键注意事项

  • 必须严格匹配模型的输入分支数量:始终传入与模型输入数一致的批量张量列表,不能将所有单样本张量扁平化传入
  • 确保每个批量张量的第一维度为批量大小,比如states.shape应为(32, state_dim),而非(32,)或其他异常形状
  • 若使用TensorFlow张量而非NumPy数组,用tf.stack()替代np.array()完成堆叠操作,逻辑完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:42:49