使用训练好的.h5模型预测时输入形状不匹配错误的解决求助
解决Keras模型预测时的输入形状不匹配问题
这个问题的核心是你的输入数据形状和模型期望的输入形状完全不匹配,咱们一步步拆解解决:
先搞清楚模型期望的输入是什么
你的模型第一层定义是:
model.add(Dense(12, input_dim=3, activation='relu'))
这里的input_dim=3意味着:模型期望每个输入样本是一个长度为3的一维向量,而且Keras默认接受批量输入,所以即使是单个样本,输入形状也需要是(1, 3)——第一个维度是批量大小(这里是1个样本),第二个维度是特征数(3个)。
你的输入哪里错了?
你构造的x是:
x = np.array([[band1_input[input_cols_loop][input_rows_loop]],[band2_input[input_cols_loop][input_rows_loop]],[band3_input[input_cols_loop][input_rows_loop]]])
这个数组的形状是(3, 1),相当于你给了模型3个样本,每个样本只有1个特征,这和模型期望的“1个样本+3个特征”完全相反,所以才会抛出错误:
ValueError: Error when checking : expected dense_1_input to have shape (3,) but got array with shape (1,)
怎么修改?
有两种简单的方法可以修正输入形状:
方法1:直接构造正确形状的输入数组
把三个特征值放在同一个一维数组里,外面再套一层代表批量的维度:
x = np.array([[ band1_input[input_cols_loop][input_rows_loop], band2_input[input_cols_loop][input_rows_loop], band3_input[input_cols_loop][input_rows_loop] ]])
这样x.shape就是(1, 3),完全符合模型的输入要求。
方法2:调整已有数组的形状
如果你已经有了(3,1)的数组,可以用reshape方法把它转成(1,3):
x = np.array([[band1_input[input_cols_loop][input_rows_loop]],[band2_input[input_cols_loop][input_rows_loop]],[band3_input[input_cols_loop][input_rows_loop]]]) # 调整形状 x = x.reshape(1, 3)
额外提示
如果之后你需要批量预测多个样本(比如从CSV里读取多行数据),输入形状应该是(N, 3)——N是样本数量,每行对应一个样本的3个特征,这样模型就能一次性处理所有样本了。
内容的提问来源于stack exchange,提问作者송준석
相关产品推荐
相关产品推荐

