训练学习y=2*x的简单神经网络准确率接近0该如何解决
准确率极低的核心原因
- 选错了任务类型对应的损失函数:你要做的是连续数值预测的回归任务,但你用了
BinaryCrossentropy(二元交叉熵),这是专门给二分类任务设计的损失函数,完全不适用于回归场景,会导致模型训练方向完全错误,无法收敛。 - 选错了评估指标:
accuracy(准确率)是分类任务的专属指标,统计的是预测类别和真实类别完全一致的样本占比。回归任务输出的是连续浮点数,几乎不可能和真实标签完全相等,所以你看到的准确率自然无限接近0,这个指标本身就不该用在这个场景里。 - 训练配置缺失:
model.fit默认的训练轮次和每轮步长都不匹配你的无限生成器,训练步数不足也会导致模型没学到规律。
你之前尝试的调整batch大小、增加网络层、归一化数值等操作都没有解决损失和指标选择错误的核心问题,所以无法提升效果。
修复后的最小可运行代码
核心修改点:将损失函数替换为回归任务常用的MSE(均方误差),评估指标换成MAE(平均绝对误差,用来衡量预测值和真实值的平均差距),补充训练步长和轮次配置。
import tensorflow as tf import numpy as np def data_generator(batch_size): start = 0 end = start + batch_size while True: x = np.arange(start, end) y = 2 * np.arange(start, end) x = np.expand_dims(x, axis=-1) y = np.expand_dims(y, axis=-1) yield x, y start += batch_size end = start + batch_size model = tf.keras.Sequential([ tf.keras.layers.InputLayer(input_shape=(1,)), tf.keras.layers.Dense(1), ]) # 适配回归任务的编译配置 model.compile( loss=tf.keras.losses.MeanSquaredError(), optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), metrics=[tf.keras.metrics.MeanAbsoluteError()], ) batch_size = 32 generator_training = data_generator(batch_size) generator_testing = data_generator(batch_size) # 补充训练参数配置 model.fit( x=generator_training, validation_data=generator_testing, steps_per_epoch=100, epochs=10, validation_steps=10 ) # 验证效果:输入x=10,预期输出接近20 print("测试输入x=10的预测结果:", model.predict(np.array([[10]]))[0][0]) # 打印权重,正常会收敛到接近2,偏置接近0 print("Dense层权重:", model.layers[0].get_weights()[0][0][0]) print("Dense层偏置:", model.layers[0].get_weights()[1][0])
训练完成后你会看到损失和MAE都持续下降趋近于0,模型权重会收敛到接近2,完美拟合y=2x的映射关系。
内容的提问来源于stack exchange,提问作者FromTheStackAndBack
相关产品推荐
相关产品推荐

