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

