CartPole强化学习中Keras Dense层输出形状异常问题咨询
输出形状异常原因
这个问题的核心是输入给model.predict()的状态张量形状不符合Keras的批次输入规范:
- CartPole环境
env.reset()返回的单步状态是长度为4的一维数组,形状为(4,) - Keras的推理接口默认要求输入的第一维为批次维度,当你传入形状为
(4,)的数组时,模型会自动将其识别为包含4个样本、每个样本特征维度为1的批次输入 - 你定义的最后一层是2个输出节点的全连接层,每个样本对应2个输出值,4个样本自然返回形状为
(4,2)的结果,和你预期的单样本输出不符。
修复方案
- 方案1:给输入状态增加批次维度,将形状调整为
(1,4)(1个样本,4个特征),示例代码如下:
import numpy as np # 扩展批次维度 state_input = np.expand_dims(state, axis=0) # 推理输出形状为(1,2) output = model.predict(state_input, verbose=0) # 提取单样本的输出结果,形状为(2,) action_value = output[0]
- 方案2:单步推理场景下直接调用模型的
__call__方法,无需走predict的批次处理逻辑,速度更快:
output = model(state[np.newaxis, ...]) action_value = output.numpy()[0]
如果你需要得到形状为(2,1)的输出,对action_value执行reshape(2,1)即可。
内容的提问来源于stack exchange,提问作者Jeongjin Shin
相关产品推荐
相关产品推荐

