实现加减运算的神经网络运行不稳定及负数输出异常求助
问题分析与修复方案
问题1:运行结果不稳定
核心原因
- 训练数据仅覆盖0-1的浮点数范围,但实际测试输入的是整数,输入分布完全超出模型的训练范围,模型无法泛化到陌生数据
- 神经网络的参数初始化是随机的,部分初始状态会导致模型陷入局部最优(比如全0输出的死区)
- 训练轮次和数据量的搭配可能不足,导致部分训练过程中模型未充分收敛
修复措施
- 给TensorFlow和NumPy设置固定随机种子,消除初始化随机性带来的结果波动
- 统一训练与测试的输入分布:要么把测试输入归一化到0-1区间,要么扩展训练数据的范围
- 适当增加训练轮次,确保模型充分收敛
问题2:减法结果异常(负数输出正数)
核心原因
减法模型的输出层使用了relu激活函数,ReLU会将所有小于0的数值直接截断为0,所以当两数相减结果为负时,模型只能输出0或极小的正数,完全不符合预期。
修复措施
将减法模型的输出层激活函数改为线性激活(Dense层默认就是线性激活,直接去掉activation='relu'即可)
修改后的完整代码
import tensorflow as tf from keras.models import Sequential from keras.layers import Dense import numpy as np # 固定随机种子,消除初始化随机性 np.random.seed(42) tf.random.set_seed(42) num_train = 2000 # 扩展训练数据范围,覆盖常见整数输入(比如0-10) X_train = np.random.uniform(0, 10, (num_train, 2)) y_train_add = X_train[:, 0] + X_train[:, 1] y_train_subtract = X_train[:, 0] - X_train[:, 1] model_add = Sequential( [ Dense(16, activation='relu'), Dense(1, activation='relu') # 加法结果非负,ReLU没问题 ] ) model_subtract = Sequential( [ Dense(16, activation='relu'), Dense(1) # 去掉ReLU,用默认线性激活,支持负数输出 ] ) batch_size = 32 epochs = 150 model_add.compile(loss='mse', optimizer='adam') model_add.fit(X_train, y_train_add, batch_size=batch_size, epochs=epochs, verbose=1) model_subtract.compile(loss='mse', optimizer='adam') model_subtract.fit(X_train, y_train_subtract, batch_size=batch_size, epochs=epochs, verbose=1) while True: print("enter first num:") x = input() if x == "end": break print("Enter operation:") op = input() print("enter second num:") y = input() X = float(x) Y = float(y) # 这里因为训练数据是0-10,所以不需要归一化,如果训练数据是0-1,这里要做X/10, Y/10 if op == "+": predicted_sum = model_add.predict(np.array([[X, Y]]), verbose=0) print(f"预测结果: {predicted_sum[0][0]:.2f}") elif op == "-": predicted_diff = model_subtract.predict(np.array([[X, Y]]), verbose=0) print(f"预测结果: {predicted_diff[0][0]:.2f}")
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

