神经网络实现整数加减时predict传列表报错的原因及解决方法
整数加减神经网络的预测错误问题及解决办法
错误原因
- 输入格式不匹配:Keras模型的
predict方法要求输入必须包含批次维度,你直接传入[X,Y]是一维列表,模型无法识别这种无批次维度的输入结构,因此抛出类型错误。 - 原代码还有两个隐藏问题:
- 训练减法模型时误写为
model_add.fit,导致model_subtract根本没被训练,就算输入格式正确也会输出错误结果。 - 减法模型的输出用了
relu激活函数,减法结果可能为负数,而relu会把所有负数置为0,完全丢失负数结果的信息。
- 训练减法模型时误写为
解决办法
- 给输入添加批次维度:把
[X,Y]改成[[X,Y]],转换成二维数组(代表1个样本的批次),让模型能正确解析输入。 - 修正训练代码的笔误:把训练减法模型的
model_add.fit改成model_subtract.fit。 - 替换减法模型的输出激活函数:将
Dense(1, activation='relu')改成Dense(1, activation='linear'),保证负数结果能正常输出。
修正后的完整代码
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import numpy as np # 示例训练数据(可根据实际需求替换) X_train = np.random.randint(0, 100, (1000, 2)) y_train_add = X_train[:, 0] + X_train[:, 1] y_train_sub = X_train[:, 0] - X_train[:, 1] model_add = Sequential( [ Dense(10, activation='relu'), Dense(1, activation='relu') ] ) model_subtract = Sequential( [ Dense(10, activation='relu'), Dense(1, activation='linear') # 替换为线性激活,支持负数输出 ] ) # 训练加法模型 model_add.compile(loss='mse', optimizer='adam') batch_size = 32 epochs = 100 model_add.fit(X_train, y_train_add, batch_size=batch_size, epochs=epochs, verbose=0) # 训练减法模型(修正笔误) model_subtract.compile(loss='mse', optimizer='adam') model_subtract.fit(X_train, y_train_sub, batch_size=batch_size, epochs=epochs, verbose=0) print("enter first num:") x = input() print("Enter operation:") op = input() print("enter second num:") y = input() X = int(x) Y = int(y) if op == "+": predicted_sum = model_add.predict([[X, Y]], verbose=0) # 添加批次维度 print(f"预测结果:{predicted_sum[0][0]:.0f}") elif op == "-": predicted_sub = model_subtract.predict([[X, Y]], verbose=0) # 添加批次维度 print(f"预测结果:{predicted_sub[0][0]:.0f}")
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

