TensorFlow神经网络损失与准确率表现异常,如何优化?
问题描述
我是机器学习新手,正在学习使用TensorFlow构建神经网络。原本针对体重-身高数据集使用线性回归,出于好奇尝试用神经网络处理,编写了如下代码:
x = file.drop(columns= "Height").values y = file.drop(columns= "Weight").values y = np.reshape(y, (-1, 1)) x = np.reshape(x, (-1, 1)) from sklearn.preprocessing import StandardScaler ss = StandardScaler() x = ss.fit_transform(x) from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2) import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Dense(16, activation = "relu"), tf.keras.layers.Dense(16, activation = "relu"), tf.keras.layers.Dense(1, activation = "sigmoid") ]) model.compile(optimizer= tf.keras.optimizers.Adam(), loss = tf.keras.losses.BinaryCrossentropy(), metrics= "accuracy") model.fit(x_train, y_train, epochs = 10, batch_size = 16)#I actually dont fully know what batch size is, im adding that just for kicks
我通过StandardScaler对数据做了标准化,以为能提升神经网络准确率,但运行代码后,损失和准确率表现极差。请问我该如何优化来改善损失和准确率?
优化方案
修正任务匹配的模型配置:你的问题是回归任务(预测身高/体重这种连续数值),但当前用的是二分类任务的配置,这是核心问题:
- 输出层:去掉
sigmoid激活,回归任务用线性输出即可,改成tf.keras.layers.Dense(1)(默认激活为linear) - 损失函数:替换为回归专用的
MeanSquaredError(均方误差),比如loss = tf.keras.losses.MeanSquaredError() - 评价指标:用回归任务的指标(如
mse、mae),别用accuracy——这是分类任务的指标,对回归完全没用
- 输出层:去掉
标准化覆盖输入和输出:你只标准化了输入x,但输出y(连续值)也需要做标准化处理,否则模型难以收敛。示例代码:
# 对y做标准化 ss_y = StandardScaler() y_train_scaled = ss_y.fit_transform(y_train) y_test_scaled = ss_y.transform(y_test) # 训练时传入标准化后的y_train_scaled,预测后用ss_y.inverse_transform()转回原始尺度简化模型+调整训练参数:
- 体重和身高是线性相关的,不需要两层带Relu的隐藏层,过度复杂的模型反而会影响效果。可以简化为:要么直接用一层线性层(和线性回归等价),要么最多加一层含少量神经元(如8个)的隐藏层
- 训练轮次太少,10轮不足以让模型收敛,改成50-100轮;同时在
model.fit()中加入validation_data=(x_test, y_test_scaled),实时观察验证集表现,避免过拟合 - 关于batch size:简单来说就是每次模型更新参数时用的样本数量,不用盲目设置,选32、64这类常规值即可——太小会导致参数更新震荡,太大会占用过多内存
检查数据正确性:确认x和y的对应关系无误(比如x是体重,y是身高),同时排查数据中是否存在缺失值、异常值,这些都会严重影响模型效果
内容的提问来源于stack exchange,提问作者MilkyMilk_07
相关产品推荐
相关产品推荐

