TensorFlow非线性回归--基于神经网络算法

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

"""
1.
shape: 矩阵维度 3*2
===================
2.
[None,1]: N行 1列
===================
3.
numpy.random.normal(loc=0.0, scale=1.0, size=None)
正态分布
loc:float
    此概率分布的均值(对应着整个分布的中心centre)
scale:float
    此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
    输出的shape,默认为None,只输出一个值

"""
xdata = np.linspace(-0.5, 0.5, 200)[:,np.newaxis]  # 后面增加维度
noise = np.random.normal(0, 0.02, xdata.shape)  # 加噪音,但要 保证和xdata的维度一致
ydata = np.square(xdata) + noise  # y=x^2+noise
# ydata=np.exp(xdata)+noise

# 定义两个placeholder
x = tf.placeholder(tf.float32, [None, 1])  # N行,1列
y = tf.placeholder(tf.float32, [None, 1])  # N行,1列,根据样本(x)定义
"""
输入层:x,输入就是一个个的点,那么就需要1个神经元就行
中间层:自定义
输出层:y,输出也是一个个的 点,配1个神经元
"""

# 定义神经网络中间层

weight = tf.Variable(tf.random_normal([1, 10]))  # 权值,连接输入层和中间层, 从正态分布中输出随机值,1(1个输入)行10(输入至中间层)列,权值放在线之上
biases = tf.Variable(tf.zeros([1, 10]))  # 偏置值,初始化为0,从一个输入,到10个中间层神经元
wx_plus_b_l1 = tf.matmul(x, weight) + biases  # 信号总和 weight*x+biases
l1 = tf.nn.tanh(wx_plus_b_l1)  # 激活函数,s形

# 定义输出层
"""
中间层的输出L1:输出层的输入
"""

weight1 = tf.Variable(tf.random_normal([10, 1]))  # 由中间层到y(输出),1-->10
biases1 = tf.Variable(tf.zeros([1, 1]))  # 偏置值,1-->1
wx_plus_b_l2 = tf.matmul(l1, weight1) + biases1  # 输出层信号总和
predict = tf.nn.tanh(wx_plus_b_l2)  # 预测的结果

# 二次代价函数
loss = tf.reduce_mean(tf.square(y - predict))  # 误差平均值

# 梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

#
with tf.Session() as ses:
    # 画变量
    ses.run(tf.global_variables_initializer())
    for _ in range(5001):
        ses.run(train_step, feed_dict={x: xdata, y: ydata})  # 使用梯度下降法训练, x:样本点

        # 得到预测值
    predict_value = ses.run(predict, feed_dict={x: xdata, y: ydata})
        # 画图
    plt.figure()
    plt.scatter(xdata, ydata)
    plt.plot(xdata, predict_value, 'r-', lw=5)  # 红色实线,线宽line width=5
    plt.show()

 

 

posted @ 2019-08-25 09:01  元気な猫  阅读(569)  评论(0编辑  收藏  举报