构建DQN强化学习模型时出现输入维度错误与list无shape属性报错
错误原因及修复方案
核心错误点
- 环境返回的状态类型错误:代码中
reset和step方法返回的self.state是Python元组类型,没有shape属性,这是AttributeError: 'list' object has no attribute 'shape'报错的直接诱因。
- 环境返回的状态类型错误:代码中
- 模型输入输出维度不匹配:环境的观测空间只有2个特征(湿度、降雨概率),且agent配置的
window_length=1,所以模型输入形状应为(1, 2),你当前写的input_shape=(1,4)完全不匹配;同时动作空间是5个离散动作,输出层神经元数和agent的nb_actions参数都写成了2,维度完全不符,这是ValueError输入维度不匹配报错的原因。
- 模型输入输出维度不匹配:环境的观测空间只有2个特征(湿度、降雨概率),且agent配置的
- 观测未做范围截断:代码中湿度计算完可能超出0~100的定义范围,虽然有reward惩罚,但会导致观测超出你定义的Box空间范围,引发隐性问题。
修复代码
1. 修改环境的状态返回格式
在__init__、step、reset方法中,把self.state的赋值改为numpy数组,同时对湿度做范围截断:
# 所有self.state赋值的地方都改成如下格式 self.state = np.array([moisture, chance_of_rain], dtype=np.int32) # step方法中湿度计算完成后加截断 moisture = np.clip(moisture, 0, 100)
2. 修改模型和agent的维度配置
def build_model(): model = Sequential() # 输入形状匹配window_length=1 + 2个观测特征 model.add(Flatten(input_shape=(1, 2))) model.add(Dense(24, activation='relu')) model.add(Dense(24, activation='relu')) # 输出匹配5个离散动作 model.add(Dense(5, activation='linear')) return model def build_agent(model): policy = BoltzmannQPolicy() memory = SequentialMemory(limit=50000, window_length=1) dqn = DQNAgent(model=model, memory=memory, policy=policy, # 动作数改为匹配环境的5个 nb_actions=5, nb_steps_warmup=10, target_model_update=1e-2) return dqn
3. 可选:获取动作置信度
DQN默认输出的是每个动作的Q值,你可以对输出做softmax归一化得到近似置信度:
# 推理阶段示例 import tensorflow as tf observation = env.reset() q_values = dqn.model.predict(np.expand_dims(np.expand_dims(observation, axis=0), axis=0), verbose=0) action_confidence = tf.keras.activations.softmax(tf.convert_to_tensor(q_values))[0].numpy() # action_confidence是长度为5的数组,每个值对应对应位置动作的置信度,总和为1
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

