深度学习--TensorFlow(6)神经网络 -- 拟合线性函数&&非线性函数

目录

一、拟合线性函数

1、生成随机坐标

2、神经网络拟合

代码

二、拟合非线性函数

1、生成二次随机点

2、神经网络拟合

代码


一、拟合线性函数

学习率0.03,训练1000次:

学习率0.05,训练1000次:

学习率0.1,训练1000次: 

 可以发现,学习率为0.05时的训练效果是最好的。

1、生成随机坐标

1、生成x坐标

2、生成随机干扰

3、计算得到y坐标

4、画点

# 生成随机点
def Produce_Random_Data():
    global x_data, y_data
    # 生成x坐标
    x_data = np.random.rand(100)

    # 生成随机干扰
    noise = np.random.normal(0, 0.01, x_data.shape)
    #                       均值 标准差 输出的形状

    # 计算y坐标
    y_data = 0.2 * x_data + 0.3 + noise

    # 画点
    plt.scatter(x_data, y_data)

2、神经网络拟合

1、创建神经网络

2、设置优化器与损失函数

3、训练(根据已有数据)

4、预测(给定横坐标,预测纵坐标)

# 创建神经网络(训练及预测)
def Neural_Network():
    # 1 创建神经网络
    model = tf.keras.Sequential()
    # 为神经网络添加层
    model.add(tf.keras.layers.Dense(units=1, input_dim=1))
#                             隐藏层 神经元个数 输入神经元个数
    # 2 设置优化器与损失函数
    model.compile(optimizer=SGD(0.05), loss='mse')
#                 优化器     学习率0.05  损失函数
# SGD:随机梯度下降法
# mse:均方误差

    # 3 训练
    for i in range(1000):
        # 训练数据并返回损失
        loss = model.train_on_batch(x_data, y_data)
        # print(loss)

    # 4 预测
    y_pred = model.predict(x_data)

    # 5 显示预测结果(拟合线)
    plt.plot(x_data, y_pred, 'r-', lw=3)    #lw:线条粗细

代码

# 拟合线性函数
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.optimizers import SGD


# 生成随机点
def Produce_Random_Data():
    global x_data, y_data
    # 生成x坐标
    x_data = np.random.rand(100)

    # 生成随机干扰
    noise = np.random.normal(0, 0.01, x_data.shape)
    #                       均值 标准差 输出的形状

    # 计算y坐标
    y_data = 0.2 * x_data + 0.3 + noise

    # 画点
    plt.scatter(x_data, y_data)


# 创建神经网络(训练及预测)
def Neural_Network():
    # 1 创建神经网络
    model = tf.keras.Sequential()
    # 为神经网络添加层
    model.add(tf.keras.layers.Dense(units=1, input_dim=1))
#                             隐藏层 神经元个数 输入神经元个数
    # 2 设置优化器与损失函数
    model.compile(optimizer=SGD(0.05), loss='mse')
#                 优化器     学习率0.05  损失函数
# SGD:随机梯度下降法
# mse:均方误差

    # 3 训练
    for i in range(1000):
        # 训练数据并返回损失
        loss = model.train_on_batch(x_data, y_data)
        # print(loss)

    # 4 预测
    y_pred = model.predict(x_data)

    # 5 显示预测结果(拟合线)
    plt.plot(x_data, y_pred, 'r-', lw=3)    #lw:线条粗细


# 1、生成随机点
Produce_Random_Data()

# 2、神经网络训练与预测
Neural_Network()

plt.show()

二、拟合非线性函数

第一层10个神经元: 

第一层5个神经元:

我感觉第一层5个神经元反而训练效果比10个的好。。。

1、生成二次随机点

 步骤:

1、生成x坐标

2、生成随机干扰

3、计算y坐标

4、画散点图

# 生成随机点
def Produce_Random_Data():
    global x_data, y_data
    # 生成x坐标
    x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
    #                                       增加一个维度

    # 生成噪声
    noise = np.random.normal(0, 0.02, x_data.shape)
    #                       均值 方差

    # 计算y坐标
    y_data = np.square(x_data) + noise

    # 画散点图
    plt.scatter(x_data, y_data)

2、神经网络拟合

步骤:

1、创建神经网络

2、设置优化器及损失函数

3、训练(根据已有数据)

4、预测(给定横坐标,预测纵坐标)

5、画图

# 神经网络拟合(训练及预测)
def Neural_Network():
    # 1 创建神经网络
    model = tf.keras.Sequential()

    # 添加层
    # 注:input_dim(输入神经元个数)只需要在输入层重视设置,后面的网络可以自动推断出该层的对应输入
    model.add(tf.keras.layers.Dense(units=5,  input_dim=1, activation='tanh'))
#                                   神经元个数 输入神经元个数 激活函数
    model.add(tf.keras.layers.Dense(units=1, activation='tanh'))

    # 2 设置优化器和损失函数
    model.compile(optimizer=SGD(0.3), loss='mse')
#                 优化器     学习率     损失函数(均方误差)

    # 3 训练
    for i in range(3000):
        # 训练一次数据,返回loss
        loss = model.train_on_batch(x_data, y_data)

    # 4 预测
    y_pred = model.predict(x_data)

    # 5 画图
    plt.plot(x_data, y_pred, 'r-', lw=5)

代码

# 拟合非线性函数
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.optimizers import SGD


# 生成随机点
def Produce_Random_Data():
    global x_data, y_data
    # 生成x坐标
    x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
    #                                       增加一个维度

    # 生成噪声
    noise = np.random.normal(0, 0.02, x_data.shape)
    #                       均值 方差

    # 计算y坐标
    y_data = np.square(x_data) + noise

    # 画散点图
    plt.scatter(x_data, y_data)


# 神经网络拟合(训练及预测)
def Neural_Network():
    # 1 创建神经网络
    model = tf.keras.Sequential()

    # 添加层
    # 注:input_dim(输入神经元个数)只需要在输入层重视设置,后面的网络可以自动推断出该层的对应输入
    model.add(tf.keras.layers.Dense(units=5, input_dim=1, activation='tanh'))
#                                   神经元个数  输入神经元个数 激活函数
    model.add(tf.keras.layers.Dense(units=1, activation='tanh'))
    #                               输出神经元个数

    # 2 设置优化器和损失函数
    model.compile(optimizer=SGD(0.3), loss='mse')
#                 优化器     学习率     损失函数(均方误差)

    # 3 训练
    for i in range(3000):
        # 训练一次数据,返回loss
        loss = model.train_on_batch(x_data, y_data)

    # 4 预测
    y_pred = model.predict(x_data)

    # 5 画图
    plt.plot(x_data, y_pred, 'r-', lw=5)


# 1、生成随机点
Produce_Random_Data()

# 2、神经网络训练与预测
Neural_Network()

plt.show()

神经网络非线性拟合是通过使用BP(反向传播)神经网络拟合非线性函数。BP神经网络结构通常由输入层、隐含层和输出层组成,其中输入层接收输入参数,隐含层进行计算和处理,输出层给出最终的输出结果。在BP神经网络中,常用的训练算法是反向传播算法,通过迭代调整网络中的权重和偏置值来优化网络的预测能力。 为了进行神经网络非线性拟合,需要准备一些非线性函数的输入输出数据来训练网络。通常会从非线性函数中随机选取一定数量的输入输出数据,其中一部分用于网络的训练,另一部分用于测试网络的拟合性能。 在MATLAB中,可以利用BP神经网络的学习算法原理和MATLAB工具箱来设计和实现BP神经网络非线性模型的拟合。你可以使用MATLAB中的m文件或者图形用户界面来进行设计。此外,还可以根据需要进行非线性函数拟合,并进行相应的仿真和建模。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [BP 神经网络非线性系统建模——非线性函数拟合](https://blog.csdn.net/m0_48229629/article/details/115144298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【智能控制实验】基于MATLAB的BP神经网络实现非线性函数拟合设计](https://blog.csdn.net/sgsx11/article/details/122397136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于BP神经网络非线性函数拟合](https://download.csdn.net/download/m0_61586834/76237124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_(*^▽^*)_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值