使用神经网络学习5的乘法表结果异常,是否需要更换ReLU激活函数?
你出现的问题由多个错误导致,不只是激活函数的问题,具体错误和修正方案如下:
核心错误点
- 输出层维度不匹配:你需要预测的是单个数值,最终输出层应该设置为
Dense(1),而不是10个神经元。你当前的输出是10维向量,和标签Y的一维结构完全不匹配,这是预测结果偏差大的核心原因。 - 评估指标选择错误:
accuracy是分类任务的专用评估指标,你当前做的是连续值预测的回归任务,该指标没有任何参考意义,显示为0属于正常现象,你只需要关注MSE损失的下降情况即可。 - 训练轮次不足:当前仅训练10轮,从损失变化趋势来看模型还远未收敛,需要增加训练轮次。
- 损失函数认知错误:你代码注释里提到的交叉熵损失是分类任务专用,完全不适合当前回归场景,继续使用MSE即可。
激活函数相关说明
对于乘5这种纯线性映射任务,你当前使用的ReLU完全可以满足需求,不需要特意更换其他激活函数。如果想进一步简化模型,甚至可以直接去掉所有隐藏层的激活函数,仅用线性变换就能完美拟合目标规则。
修正后的可运行代码
import random import numpy as np from keras.models import Sequential from tensorflow.keras.layers import Dense # 构造数据集 X = [] Y = [] for i in range(10000): n = random.randint(0, 300) X.append(n) Y.append(n*5) X = np.array(X) Y = np.array(Y) # 搭建模型 model = Sequential() model.add(Dense(10, activation='relu', input_shape=(1,))) model.add(Dense(10, activation='relu')) # 修正输出层为1个神经元,默认使用线性激活 model.add(Dense(1)) # 去掉无用的accuracy指标 model.compile(loss='MSE', optimizer='adam') # 增加训练轮次到100轮保证收敛 model.fit(X, Y, batch_size=50, validation_split=0.05, epochs=100, verbose=1, shuffle=True) # 测试 test_array=np.array([4,27,100,121,9]) print(model.predict(test_array))
运行修正后的代码,最终预测结果会和你预期的x*5输出几乎完全一致,误差可以忽略不计。
内容的提问来源于stack exchange,提问作者Petter_M
相关产品推荐
相关产品推荐

