tensorflow神经网络拟合非线性函数

本实验通过建立一个含有两个隐含层的BP神经网络,拟合具有二次函数非线性关系的方程,并通过可视化展现学习到的拟合曲线,同时随机给定输入值,输出预测值,最后给出一些关键的提示。

源代码如下:

# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

plotdata = { "batchsize":[], "loss":[] }
def moving_average(a, w=11):
    if len(a) < w:
        return a[:]
    return [val if idx < w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]

#生成模拟数据,二次函数关系
train_X = np.linspace(-1, 1, 100)[:, np.newaxis]
train_Y = train_X*train_X + 5 * train_X + np.random.randn(*train_X.shape) * 0.3 

#子图1显示模拟数据点
plt.figure(12)
plt.subplot(221)
plt.plot(train_X, train_Y, ‘ro‘, label=‘Original data‘)
plt.legend()

# 创建模型
# 占位符
X = tf.placeholder("float",[None,1])
Y = tf.placeholder("float",[None,1])
# 模型参数
W1 = tf.Variable(tf.random_normal([1,10]), name="weight")
b1 = tf.Variable(tf.zeros([1,10]), name="bias")
W2 = tf.Variable(tf.random_normal([10,6]), name="weight")
b2 = tf.Variable(tf.zeros([1,6]), name="bias")
W3 = tf.Variable(tf.random_normal([6,1]), name="weight")
b3 = tf.Variable(tf.zeros([1]), name="bias")

# 前向结构
z1 = tf.matmul(X, W1) + b1
z2 = tf.nn.relu(z1)
z3 = tf.matmul(z2, W2) + b2
z4 = tf.nn.relu(z3)
z5 = tf.matmul(z4, W3) + b3

#反向优化
cost =tf.reduce_mean( tf.square(Y - z5))
learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent

# 初始化变量
init = tf.global_variables_initializer()
# 训练参数
training_epochs = 5000
display_step = 2

# 启动session
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(training_epochs+1):
        sess.run(optimizer, feed_dict={X: train_X, Y: train_Y})

        #显示训练中的详细信息
        if epoch % display_step == 0:
            loss = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            print ("Epoch:", epoch, "cost=", loss)
            if not (loss == "NA" ):
                plotdata["batchsize"].append(epoch)
                plotdata["loss"].append(loss)
    print (" Finish")

    #图形显示
    plt.subplot(222)
    plt.plot(train_X, train_Y, ‘ro‘, label=‘Original data‘)
    plt.plot(train_X, sess.run(z5, feed_dict={X: train_X}), label=‘Fitted line‘)
    plt.legend()
    plotdata["avgloss"] = moving_average(plotdata["loss"])

    plt.subplot(212)
    plt.plot(plotdata["batchsize"], plotdata["avgloss"], ‘b--‘)
    plt.xlabel(‘Minibatch number‘)
    plt.ylabel(‘Loss‘)
    plt.title(‘Minibatch run vs Training loss‘)
    plt.show()
    #预测结果
    a=[[0.2],[0.3]]
    print ("x=[[0.2],[0.3]],z5=", sess.run(z5, feed_dict={X: a}))
    

运行结果如下:

结果实在是太棒了,把这个关系拟合的非常好。

原文地址:https://www.cnblogs.com/cvtoEyes/p/9063291.html

时间: 2024-08-05 07:40:52

tensorflow神经网络拟合非线性函数的相关文章

最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)

1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*rand(1,size(y,2)); %%最小二乘拟合 xf=log(x); yf=yrand; xfa = [ones(1,size(xf,2));xf] w = inv(xfa*xfa')*xfa*yf';%直接拟合得到的结果 参考资料: 1.http://blog.csdn.net/lotus_

Matlab 最小二乘法拟合非线性函数

1.最小二乘原理 参考资料: 1.http://blog.csdn.net/lotus___/article/details/20546259 2.http://blog.sina.com.cn/s/blog_5404ea4f0101afth.html 2.matlab实现最小二乘法 利用matlab的最小二乘拟合函数对非线性函数进行拟合,具体地拟合的函数: [q r] = lsqcurvefit(fun, q_0, xdata, ydata);输入参数:fun:需要拟合的函数,假定有n个需要拟

关于神经网络拟合任意函数的讨论

参考这篇文章: https://www.cnblogs.com/yeluzi/p/7491619.html 从这篇文章看, 1. 文章里面讨论的是两层隐藏层的,但是实际上一层网络就能拟合任意函数 2. 实际工作上,深的还是更好. 原文地址:https://www.cnblogs.com/charlesblc/p/8494079.html

神经网络是如何拟合任意函数的

一个最原始粗暴的拟合任意函数的思路,是将函数切成很多段线性函数,之后用逻辑门控制当x在哪一个区间时,某些逻辑门被激活,对应的线性函数的权重w与偏移量b在逻辑门的包裹下变成非0,计算出y在这一段的输出值. 需要推导出拟合函数y=f(x)需要哪些逻辑门,以及如何使用神经网络构建这些逻辑门. 首先最简单的是开关门: ${s^{(1)}}(x) = t{\rm{ = Relu}}({\rm{1 - 1000*Relu}}({\rm{u}}))$ 使用Relu激活函数构建的开关门比起使用sigmoid函数

非线性函数的最小二乘拟合——兼论Jupyter notebook中使用公式 [原创]

突然有个想法,利用机器学习的基本方法——线性回归方法,来学习一阶RC电路的阶跃响应,从而得到RC电路的结构特征——时间常数τ(即R*C).回答无疑是肯定的,但问题是怎样通过最小二乘法.正规方程,以更多的采样点数来降低信号采集噪声对τ估计值的影响.另外,由于最近在捣鼓Jupyter和numpy这些东西,正好尝试不用matlab而用Jupyter试试看.结果是意外的好用,尤其是在Jupyter脚本中插入LaTeX格式的公式的功能,真是太方便了!尝试了直接把纸上手写的公式转换到Jupyter脚本中的常

遗传算法的C语言实现(一):以非线性函数求极值为例

以前搞数学建模的时候,研究过(其实也不算是研究,只是大概了解)一些人工智能算法,比如前面已经说过的粒子群算法(PSO),还有著名的遗传算法(GA),模拟退火算法(SA),蚁群算法(ACA)等.当时懂得非常浅,只会copy别人的代码(一般是MATLAB),改一改值和参数,东拼西凑就拿过来用了,根本没有搞懂的其内在的原理到底是什么.这一段时间,我又重新翻了一下当时买的那本<MATLAB智能算法30个案例分析>,重读一遍,发现这本书讲的还是非常不错的,不仅有现成算法的MATLAB实现,而且把每一种算

遗传算法优化BP神经网络——非线性函数拟合

遗传算法基本的操作分为: 1.选择操作 2.交叉操作 3.变异操作 遗传算法的基本要素包括染色体编码方法.适应度函数.遗传操作和运行参数. 遗传算法优化BP神经网络算法流程如图3-4所示:

TensorFlow 过拟合与正则化(regularizer)

所谓过拟合,就是当一个模型过于复杂后,它可以很好的处理训练数据的每一个数据,甚至包括其中的随机噪点.而没有总结训练数据中趋势.使得在应对未知数据时错误里一下变得很大.这明显不是我们要的结果. 我们想要的是在训练中,忽略噪点的干扰,总结整体趋势.在应对未知数据时也能保持训练时的正确率. 上图中第一种情况,模型过于简单,未能很好的反应数据的总体趋势. 第三种情况就属于过拟合的情况.虽然完美的反应了练习数据的状况,但是明显被噪点影响了. 第二种情况是我们想要的理想状况. 为了避免过拟合,通常使用的方法

TensorFlow 神经网络相关函数

TensorFlow 激活函数 激活操作提供用于神经网络的不同类型的非线性.这些包括平滑的非线性(sigmoid,tanh,elu,softplus,和softsign),连续的,但不是到处可微函数(relu,relu6,crelu和relu_x),和随机正规化(dropout). 所有激活操作应用于分量,并产生与输入张量相同形状的张量. tf.nn.relu tf.nn.relu6 tf.nn.crelu tf.nn.elu tf.nn.softplus tf.nn.softsign tf.n