使用带一层中间层的神经网络来作为非线性模型构建
故而共有4个可调节量,分别为 weight_L1, weight_L2, biases_L1, biase_L2 可作为优化调节量
构建好模型之后,优化器用梯度下降法来做,运用梯度下降法的过程中,不断调节以上4个量
以达到使得最后代价函数最小的 weight_L1, weight_L2, biases_L1, biase_L2
神经网络的输出为,经过调节后运用较好的 weight_L1, weight_L2, biases_L1, biase_L2值
得出对y_data的非线性拟合
拟合过程为对原始的x_data输入,由 200 x 1 的矩阵 --> 200 x 10 的矩阵 --> 200 x 1 的矩阵
#-*-coding:utf-8-*-
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#这里x_data,y_data 是一个200行1列的矩阵
x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis]
noise = np.random.normal(0,0.02,x_data.shape)
y_data = np.square(x_data)+noise
#plt.scatter(x_data,y_data)
#plt.show()
#定义两个placeholder
x = tf.placeholder(tf.float32,[None,1])
y = tf.placeholder(tf.float32,[None,1])
#定义神经网络中间层 1,10 分别表示输入为一个,输出为10个,代表中间层有10个神经元
#weight_L1 为权重,biases_L1为偏置值,random_normal 为10个正态分布随机值
#biases_L1 为初始为[[0.]],与weight_L1相加后,把weight_L1的每一项都加了一个biases_L1
#x,y 就是x_data, y_data 这里 weight_L1,weight_L2,biases_L1,biase_L2 是可优化调节量
#Wx_plus_b_L1 和 L1 是200行10列的矩阵
#tf.nn.tanh() 是双曲线切线激活函数
weight_L1 = tf.Variable(tf.random_normal([1,10]))
biases_L1 = tf.Variable(tf.zeros([1,1]))
Wx_plus_b_L1 = tf.matmul(x,weight_L1)+biases_L1
L1 = tf.nn.tanh(Wx_plus_b_L1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(biases_L1))
print(sess.run(Wx_plus_b_L1, feed_dict={x: x_data, y: y_data}))
#定义神经网络输出层
weight_L2 = tf.Variable(tf.random_normal([10,1]))
biases_L2 = tf.Variable(tf.zeros([1,1]))
Wx_plus_b_L2 = tf.matmul(L1,weight_L2)+biases_L2
prediction = tf.nn.tanh(Wx_plus_b_L2)
#二次代价函数
loss = tf.reduce_mean(tf.square(y - prediction))
#用梯度下降法训练
optimizer = tf.train.GradientDescentOptimizer(0.1)
train = optimizer.minimize(loss)
with tf.Session() as sess:
#变量初始化
sess.run(tf.global_variables_initializer())
for _ in range(2000):
sess.run(train,feed_dict={x:x_data,y:y_data})
#获得预测值
prediction_value = sess.run(prediction,feed_dict={x:x_data})
plt.scatter(x_data,y_data)
plt.plot(x_data,prediction_value,'r-',lw=5)
plt.show()
输出结果: