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

构建DQN强化学习模型时出现输入维度错误与list无shape属性报错

错误原因及修复方案

核心错误点

    1. 环境返回的状态类型错误:代码中reset和step方法返回的self.state是Python元组类型,没有shape属性,这是AttributeError: 'list' object has no attribute 'shape'报错的直接诱因。
    1. 模型输入输出维度不匹配:环境的观测空间只有2个特征(湿度、降雨概率),且agent配置的window_length=1,所以模型输入形状应为(1, 2),你当前写的input_shape=(1,4)完全不匹配;同时动作空间是5个离散动作,输出层神经元数和agent的nb_actions参数都写成了2,维度完全不符,这是ValueError输入维度不匹配报错的原因。
    1. 观测未做范围截断:代码中湿度计算完可能超出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:15:04