You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:19:45