TensorFlow DNNRegressor拟合二次函数效果不佳问题求助
解决DNNRegressor拟合二次函数效果不佳的问题
我来帮你梳理下代码里可能存在的核心问题,再给出调整后的完整实现方案:
常见问题分析
- 特征列定义缺失:DNNRegressor需要明确的特征列配置,直接传入numpy数组会导致模型无法正确识别输入结构
- 模型容量不足:默认的DNN结构神经元数量太少,不足以拟合二次曲线的非线性关系
- 训练参数不合理:迭代步数太少、优化器/学习率选择不当,会导致模型拟合不充分
- 数据流程不规范:缺少训练/测试集拆分,预处理没有统一应用到全量数据,容易出现拟合偏差
调整后的完整代码
import tensorflow as tf import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from matplotlib import pyplot as plt def extract_prediction(predictions): """提取预测结果的辅助函数""" return [pred['predictions'][0] for pred in predictions] # 生成带噪声的二次函数数据集 x = np.linspace(-1, 1, 500).reshape([-1, 1]) noise = np.random.normal(0, 0.05, x.shape) y = np.square(x) + noise # 补全目标函数定义 # 拆分训练集与测试集,避免过拟合 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) # 特征标准化,提升模型收敛效率 scaler = StandardScaler() x_train_scaled = scaler.fit_transform(x_train) x_test_scaled = scaler.transform(x_test) # 定义模型输入特征列 feature_columns = [tf.feature_column.numeric_column('x', shape=[1])] # 构建具备足够拟合能力的DNNRegressor model = tf.estimator.DNNRegressor( feature_columns=feature_columns, hidden_units=[32, 16], # 两层隐藏层,提升非线性拟合能力 optimizer=tf.optimizers.Adam(learning_rate=0.001), # Adam优化器适配更稳定的学习过程 model_dir='./dnn_quadratic_model' # 可选:模型保存路径,方便后续复用 ) # 构建高效的训练/预测输入管道 def input_fn(x_data, y_data, batch_size=32, shuffle=True): dataset = tf.data.Dataset.from_tensor_slices(({'x': x_data}, y_data)) if shuffle: dataset = dataset.shuffle(buffer_size=len(x_data)) dataset = dataset.batch(batch_size).repeat() return dataset # 训练模型,增加步数确保充分收敛 model.train( input_fn=lambda: input_fn(x_train_scaled, y_train), steps=5000 ) # 生成测试集预测结果 test_predictions = extract_prediction(model.predict(input_fn=lambda: input_fn(x_test_scaled, y_test, shuffle=False))) # 可视化拟合效果 plt.scatter(x_test, y_test, label='真实数据', alpha=0.5) plt.scatter(x_test, test_predictions, label='预测结果', alpha=0.5) plt.plot(x, np.square(x), 'r--', label='原始二次函数') plt.legend() plt.show()
关键调整说明
- 明确特征列:通过
tf.feature_column.numeric_column告诉模型输入特征的维度和类型,确保输入解析正确 - 扩容模型结构:设置两层隐藏层共48个神经元,足够捕捉二次曲线的非线性模式
- 优化训练配置:选用Adam优化器并设置0.001的学习率,同时增加训练步数到5000,保证模型充分收敛
- 规范数据流程:拆分训练测试集、统一标准化预处理,避免数据泄露和拟合偏差
- 高效输入管道:用
tf.data.Dataset构建批量、可打乱的输入流,提升训练效率
运行这段代码后,你会看到预测结果和真实数据、原始二次函数的拟合效果会有明显提升。
内容的提问来源于stack exchange,提问作者Duan Shiheng
相关产品推荐
相关产品推荐

