神经网络输入形状不匹配:加法模型推理报错解析
问题分析与解决
你的报错核心原因是Keras模型要求输入必须包含批量维度,哪怕是单个样本也不例外,具体拆解如下:
1. 模型输入维度的规则
Keras中,无论是训练还是推理,模型的输入都需要遵循「批量维度在前」的格式:
- 输入形状为
(batch_size, feature_dim),其中batch_size是样本数量(可以是None表示任意大小),feature_dim是单个样本的特征数。
2. 加法模型的输入要求
你的加法模型在训练时使用的X_train形状是(1000, 2),对应1000个样本(批量维度),每个样本有2个特征。Keras会根据训练数据自动推断模型的输入规格为(None, 2)——即接受任意批量大小,每个样本必须有2个特征的二维输入。
而你推理时传入的np.array([3,4])是一维数组,形状为(2,),没有批量维度,模型无法识别这是「1个包含2个特征的样本」,因此报错提示「预期形状(None, 2),但输入形状是(2,)」。
3. 平方模型为何可以用(1,)输入?
你的平方模型在第一层显式指定了input_shape=(1,),这会让Keras自动为输入添加批量维度,即模型实际期望的输入形状是(None, 1)。当你传入np.array([3])(形状(1,))时,Keras会自动将其扩展为(1, 1)(1个样本,每个样本1个特征),因此可以正常运行。不过严格来说,为了保持一致性,最好也传入二维数组np.array([[3]])。
4. 修复后的代码
将加法模型的输入改为二维数组即可解决问题,修改后的推理代码如下:
import tensorflow as tf import numpy as np model_add = tf.keras.models.load_model('model_add.keras') model_sqr = tf.keras.models.load_model('model_sqr.keras') # 为加法模型输入添加批量维度,形状变为(1,2) add_result = model_add.predict(np.array([[3, 4]])) # 平方模型的输入也统一改为二维格式,更规范 predicted_product = model_sqr.predict(add_result) - model_sqr.predict(np.array([[3]])) - model_sqr.predict(np.array([[4]])) print(predicted_product/2)
你也可以用np.expand_dims来手动添加批量维度,效果相同:
add_input = np.expand_dims(np.array([3,4]), axis=0) # 形状从(2,)变为(1,2) add_result = model_add.predict(add_input)
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

