(三)使用TensorFlow对一元二次函数进行预测

该博客主要介绍使用TensorFlow进行机器学习的数据拟合训练。包括导入所需库、准备数据、创建placeholder、构建隐藏层和输出层,求出均方差cost值并选取优化器,迭代训练后绘制拟合曲线,最后展示运行结果,拟合效果较好。
部署运行你感兴趣的模型镜像

1、导入所需的库

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

pyplot库是用来绘制数据点与预测的一元二次曲线的拟合关系

2、数据的准备

x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
noise = np.random.normal(1, 0.01, x_data.shape)
y_data = np.square(x_data) + noise

假设x_data是数据中的自变量,y_data是因变量。

第一行:为方便后续绘制图形,在调用

np.linspace(-0.5, 0.5, 200)[:, np.newaxis]

使得x_data的值为:-0.5到0.5的范围内均匀取值的200个点,并增加x_data的维度,使得x_data的shape为[200,1]。根据本人的理解,这里调整维度的原因可能是因为后续我们在传入x_data的时候是每次传一个值,但是传的次数不定,所以shape应该为[None,1],所以需要增加一个维度(如理解错误,欢迎留言斧正)。

第二行:创建一个以1为指定值,方差为0.01并且shape与x_data相同的noise变量。为什么创建这个变量呢,因为我们想模拟一堆大概符合y=x^2+0.01的数据,让程序通过学习这些数据,画出一条线来拟合这些数据。

3、创建placeholder

x_p = tf.placeholder(tf.float32, shape=[None, 1])

创建一个个数未知,但每次只传一个的placeholder

4、隐藏层

l_one_w = tf.Variable(tf.random_normal(shape=[1, 10]))
l_one_b = tf.Variable(tf.zeros(shape=[1, 10]))
l1 = tf.nn.tanh(tf.matmul(x_p, l_one_w) + l_one_b)

第一行:创建一个随机权重变量l_one_w,shape为[1,10],并且符合标准正态分布。shape为[1,10]的原因是在生成预测值的时候,x_p会与l_one_w进行相乘,两矩阵相乘的充要条件是第一个矩阵的列数与第二个矩阵的行数相等,所以l_one_w的行数为1,列数可以随意指定,也可以指定为20.

第二行:创建一个随机偏秩变量l_one_b,shape为[1,10],值都为0。shape为[1,10]的原因是每次输入数据的shape为1x1,l_one_w的shape为1x10,所以相乘的结果的shape为1x10,故l_one_b的shape为[1,10]

第三行:将输入矩阵与权重矩阵相乘再加上偏秩矩阵,将tanh激活函数作用于结果,使结果非线性化

5、输出层

l_two_w = tf.Variable(tf.random_normal(shape=[10, 1]))
l_two_b = tf.Variable(tf.zeros(shape=[1, 1]))
prediction = tf.matmul(l1, l_two_w) + l_two_b

6、求出均方差cost值、选取优化器并初始化变量

loss = tf.reduce_mean(tf.square(y_data - prediction))
train_step = tf.train.GradientDescentOptimizer(0.15).minimize(loss)
init = tf.global_variables_initializer()

7、迭代训练并在训练结束后绘制拟合的曲线

with tf.Session() as sess:
    sess.run(init)
    for step in range(2001):
        sess.run(train_step, feed_dict={x_p: x_data})
    prediction = sess.run(prediction, feed_dict={x_p: x_data})
    plt.figure()
    plt.scatter(x_data, y_data)
    plt.plot(x_data, prediction, 'r-', lw=5)
    plt.show()

8、运行结果

可以看到拟合的还是不错的,下面贴出完整代码

# -*- coding: UTF-8 -*-


import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
noise = np.random.normal(1, 0.01, x_data.shape)
y_data = np.square(x_data) + noise

x_p = tf.placeholder(tf.float32, shape=[None, 1])
# 第一层隐藏层
# 因为输入数据x与weights相乘后为1*10的向量,所以biases的shape为1*10
l_one_w = tf.Variable(tf.random_normal(shape=[1, 10]))
l_one_b = tf.Variable(tf.zeros(shape=[1, 10]))
l1 = tf.nn.tanh(tf.matmul(x_p, l_one_w) + l_one_b)
# 输出层
# 因为输入数据x与weights相乘后为1*1的向量,所以biases的shape为1*1
l_two_w = tf.Variable(tf.random_normal(shape=[10, 1]))
l_two_b = tf.Variable(tf.zeros(shape=[1, 1]))
prediction = tf.matmul(l1, l_two_w) + l_two_b

loss = tf.reduce_mean(tf.square(y_data - prediction))
train_step = tf.train.GradientDescentOptimizer(0.15).minimize(loss)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for step in range(2001):
        sess.run(train_step, feed_dict={x_p: x_data})
    prediction = sess.run(prediction, feed_dict={x_p: x_data})
    plt.figure()
    plt.scatter(x_data, y_data)
    plt.plot(x_data, prediction, 'r-', lw=5)
    plt.show()

有不足之处欢迎提问

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think>嗯,用户让我用序贯方法搭建神经网络来求解一元二次函数y=3x²+4x+2,并用给定的数据点测试。首先,我需要明确用户的需求。这里的“求解”可能指的是让神经网络根据输入x预测对应的y值,也就是建立一个回归模型。 用户提到的序贯方法应该是指使用Keras中的Sequential模型,对吧?那接下来,我需要考虑如何构建这个神经网络的结构。因为输入是单个变量x,输出是y,所以输入层应该有一个节点,输出层也是一个节点。中间可能需要添加一些隐藏层,但二次函数相对简单,可能不需要太深的网络。不过,由于二次函数的非线性,至少需要一个隐藏层并使用激活函数,比如ReLU或者tanh,来引入非线性能力。 数据准备方面,首先得生成训练数据。二次函数的定义域很广,但用户可能希望模型在特定范围内有效。不过用户给的测试数据是[0,1,2,-3,1.5],这些点分布在不同的区域,包括负数,所以训练数据应该覆盖这些区域。可能需要生成从-3到2之间的x值,并计算对应的y值作为标签。但是要注意,如果只训练这个区间的数据,模型可能在更远的区域表现不好,但用户可能只需要在这些测试点上有效。 接下来是数据集的划分,需要分成训练集和验证集,可能用80-20的比例。然后标准化数据,因为神经网络的训练对输入数据的尺度敏感,将x标准化到均值0,方差1可能会有帮助。 模型构建部分,使用Sequential模型,添加几个全连接层。比如,输入层后接一个或多个隐藏层,每层可能有多个神经元,比如64个,再激活函数用ReLU。然后输出层一个神经元,不用激活函数,因为是回归任务。损失函数用均方误差,优化器用Adam,学习率可能需要调整。 训练时,设置合适的epochs和batch_size,比如1000个epoch,因为简单的问题可能收敛快,但也要防止过拟合。早停法(EarlyStopping)可以用来监控验证损失,如果连续几次没有改善就停止训练,节省时间。 训练完成后,用测试数据评估模型,计算预测值和真实值的误差。然后可视化训练过程中的损失变化,以及预测结果和真实函数的对比,这样能直观看出模型的表现。 不过,这里可能存在一个问题:二次函数本身是确定性的,用神经网络来拟合可能有点大材小用,但用户可能是为了练习如何构建回归模型。需要确保生成的训练数据足够覆盖测试点的范围,尤其是x=-3的时候,如果训练数据中没有足够的负数样本,模型可能在那里预测不准。另外,可能需要调整网络结构,比如更多的层或神经元,或者调整学习率,如果发现模型在训练时损失不下降的话。 另外,用户可能对神经网络的原理不太熟悉,所以解释的时候需要简明,强调数据准备、模型构建、训练和评估的步骤。可能还需要提醒过拟合的问题,比如如果训练数据太少,或者模型太复杂,但在这个案例中,问题相对简单,可能不太容易过拟合。 最后,测试的时候用给定的数据点,并展示预测结果和真实值的对比,让用户看到模型的效果。可能还需要分析误差的原因,比如是否训练数据不足,或者模型结构需要调整。</think>好的,我将分步骤介绍如何使用序贯(Sequential)方法构建神经网络求解一元二次函数,并用指定数据测试。以下是详细过程: --- ### 一、问题分析 目标:用神经网络拟合函数 `y = 3x² + 4x + 2`,并对输入 `[0, 1, 2, -3, 1.5]` 进行预测。 --- ### 二、步骤实现 #### 1. 数据准备 - **生成训练数据**:在合理区间(如 `x ∈ [-5, 5]`)生成均匀分布的 `x` 值,通过公式计算对应的 `y` - **数据拆分**:将数据分为训练集(80%)和验证集(20%) - **标准化**:对输入 `x` 进行标准化处理(均值为0,标准差为1) ```python import numpy as np from sklearn.model_selection import train_test_split # 生成数据 X = np.random.uniform(-5, 5, 1000).reshape(-1, 1) y = 3 * X**2 + 4 * X + 2 # 拆分数据集 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2) # 标准化 mean, std = X_train.mean(), X_train.std() X_train = (X_train - mean) / std X_val = (X_val - mean) / std ``` #### 2. 模型构建(序贯方法) 使用全连接网络(Dense层): ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential([ Dense(64, activation='relu', input_shape=(1,)), # 输入层 Dense(64, activation='relu'), # 隐藏层 Dense(1) # 输出层(无激活函数) ]) model.compile(optimizer='adam', loss='mse') # 使用均方误差损失 ``` #### 3. 模型训练 ```python history = model.fit( X_train, y_train, validation_data=(X_val, y_val), epochs=200, batch_size=32, verbose=0 ) ``` #### 4. 测试预测 ```python test_points = np.array([0, 1, 2, -3, 1.5]).reshape(-1, 1) test_points_norm = (test_points - mean) / std # 应用相同标准化 predictions = model.predict(test_points_norm).flatten() # 真实值计算 true_values = 3*test_points**2 + 4*test_points + 2 # 对比结果 for x, pred, true in zip(test_points, predictions, true_values): print(f"x={x[0]:.1f} | 预测值={pred:.2f} | 真实值={true[0]:.2f} | 误差={abs(pred - true[0]):.2f}") ``` --- ### 、结果示例(可能输出) ``` x=0.0 | 预测值=2.01 | 真实值=2.00 | 误差=0.01 x=1.0 | 预测值=9.03 | 真实值=9.00 | 误差=0.03 x=2.0 | 预测值=22.12 | 真实值=22.00 | 误差=0.12 x=-3.0 | 预测值=17.23 | 真实值=17.00 | 误差=0.23 x=1.5 | 预测值=14.38 | 真实值=14.75 | 误差=0.37 ``` --- ### 四、关键改进点 1. **增加网络深度**:添加更多隐藏层提高非线性拟合能力 2. **调整学习率**:使用 `optimizer=Adam(learning_rate=0.001)` 控制收敛速度 3. **早停法**:添加 `EarlyStopping(monitor='val_loss', patience=10)` 防止过拟合 --- ### 五、原理说明 神经网络通过反向传播学习输入 `x` 与输出 `y` 的非线性关系。对于二次函数: $$ y = ax^2 + bx + c $$ 网络需要学习: - 通过 `Dense层` 的线性组合 `wx + b` - 通过 `ReLU激活函数` 引入非线性 - 最终组合出二次项特征 --- ### 六、可视化建议 1. 绘制训练损失曲线观察收敛情况 2. 绘制预测结果与真实函数的对比图(散点图+曲线图) 需要完整代码或可视化示例可告知我补充!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值