使用TensorFlow与MSE的神经网络准确率无法突破20%原因咨询
预测x²时准确率极低的原因分析
核心问题:误用分类任务的评价指标
你在模型编译时指定了metrics=["accuracy"],但准确率是专门给分类任务设计的——它统计的是模型预测结果和真实标签完全匹配的比例。而你的任务是回归(预测连续的x²值),神经网络几乎不可能输出和真实值完全一致的浮点数,所以这个准确率完全没有参考价值,自然会极低。
解决:删掉metrics=["accuracy"],或者换成回归任务适用的指标,比如mae(平均绝对误差)。训练样本量严重不足
你只用到了10个训练样本(x从0到9归一化后的数据),这么少的数据量,模型根本学不到x²的全局规律,要么过拟合到这10个点,要么完全没学到有效模式。
解决:生成更多样本,比如用tf.range(1000, dtype="float32")/999.0来生成0到1之间的1000个连续样本,或者用随机采样的方式生成更多数据。可优化的细节
- 目前250轮训练可能不够,可以尝试增加到500-1000轮,让模型有足够的时间收敛
- 可以微调隐藏层的神经元数量,或者尝试调整Adam优化器的学习率(比如
optimizer=keras.optimizers.Adam(learning_rate=0.001))
修正后的示例代码
import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 生成更多训练样本 x_train = tf.range(1000, dtype="float32")/999.0 y_train = (x_train)**2.0 # 直接用归一化后的x计算y,避免重复计算 x_train = tf.reshape(x_train, (len(x_train), 1)) y_train = tf.reshape(y_train, (len(y_train), 1)) model = keras.Sequential([ layers.Dense(10, input_dim=1, activation='relu', kernel_initializer='he_uniform'), layers.Dense(10, activation='relu', kernel_initializer='he_uniform'), layers.Dense(1) ]) # 去掉accuracy,用MSE作为损失,可选添加MAE作为监控指标 model.compile( loss = "mse", optimizer = "adam", metrics = ["mae"], # 回归任务用MAE更合理 ) # 增加训练轮次 model.fit(x_train,y_train, epochs=500, batch_size=32, verbose=2) yhat = model.predict(x_train) # 反归一化查看结果(如果需要) print(tf.abs(yhat*(999.0**2.0)))
内容的提问来源于stack exchange,提问作者Gary Drocella
相关产品推荐
相关产品推荐

