使用DQN训练CartPole时keras.predict()维度不匹配错误求助
DQN训练CartPole矩阵维度不匹配问题解决方案
问题根源
Keras的predict函数要求输入为批量二维数组(形状为(样本数, 特征数)),但你传入的state是一维数组(形状(4,)),导致模型矩阵乘法时,输入维度[4]与层权重维度[4,24]不匹配,触发报错。
具体修复步骤
1. 修正输入维度
调用predict前,给单个状态增加批量维度,将形状从(4,)转为(1,4):
# 原错误代码 q_value = self.model.predict(state) # 修改后 import numpy as np q_value = self.model.predict(np.expand_dims(state, axis=0), verbose=0)[0]
np.expand_dims(state, axis=0):给一维数组增加第0维度,变成批量格式[0]:取出批量中的单个样本结果,恢复原逻辑需要的一维Q值数组verbose=0:关闭predict的日志输出,避免冗余信息
如果是批量状态states,确保其形状为(批量大小, 4),若为一维数组则用states = np.array(states).reshape(-1, 4)修正。
2. 验证模型输入层定义
确认模型输入层匹配CartPole的4维状态,示例正确定义:
from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam def build_model(self): model = Sequential() model.add(Dense(24, activation='relu', input_shape=(4,))) # 输入形状为(4,),对应4维状态 model.add(Dense(24, activation='relu')) model.add(Dense(2, activation='linear')) # CartPole有2个可选动作 model.compile(optimizer=Adam(learning_rate=0.001), loss='mse') return model
避免输入层写成input_shape=(4,1)或其他错误形状。
3. 检查输入数据形状
在调用predict前打印输入形状,确认格式正确:
print(state.shape) # 应输出(1,4)(单个样本)或(n,4)(批量样本)
内容的提问来源于stack exchange,提问作者donghyunlee
相关产品推荐
相关产品推荐

