# 输入一个 x 会计算出 y 值 y 是预测值,如果与 真的 y 值(y_data)接近就成功了
import tensorflow as tf
import numpy as np
# py 的画图工具
import matplotlib.pyplot as plt
# 用 numpy 生成个 200 个属性点 从 -0.5 到 0.5 间平均生成 200 个点
#x_data = np.linspace(-0.5, 0.5, 200) # 这只是生成了一维的数组
# 用下边这句可以生成二维数组
x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
# 生成随机值,和 x_data 的形状是一样的 ( 噪点 )
noise = np.random.normal(0, 0.02, x_data.shape)
# x_data 的平方+随机数
y_data = np.square( x_data ) + noise
# 定义二个占位符
x = tf.placeholder( tf.float32, [None, 1] ) # [None, 1] 行不定,列只有一列
y = tf.placeholder( tf.float32, [None, 1] )
# 构建神经网络中间层 一行十列
Weights_L1 = tf.Variable( tf.random_normal([1, 10]))
biases_L1 = tf.Variable( tf.zeros([1, 10]) )
# 求出信号的总和 矩阵相乘,
Wx_plus_b_L1 = tf.matmul(x, Weights_L1) + biases_L1
# 中间层的输出
L1 = tf.nn.tanh( Wx_plus_b_L1 )
# 输出层 十行一列
Weights_L2 = tf.Variable( tf.random.normal([10, 1]))
biases_L2 = tf.Variable( tf.zeros([1, 1]) )
# 求出信号的总和 矩阵相乘,
Wx_plus_b_L2 = tf.matmul(L1, Weights_L2) + biases_L2
# 得出最后的预测结果
pred = tf.nn.tanh( Wx_plus_b_L2 )
# 二次代价函数
loss = tf.reduce_mean( tf.square(y - pred) )
# 梯度下降法的优化器 最小化代价函数
train = tf.train.GradientDescentOptimizer( 0.2 ).minimize( loss )
with tf.Session() as sess:
# 初始化变量
sess.run( tf.global_variables_initializer() )
# 训练 2000 次
for _ in range( 2000 ):
sess.run( train, feed_dict={x:x_data, y:y_data} )
# 得到预测值
value = sess.run( pred, feed_dict={x:x_data} )
# 用画图形式展现
plt.figure()
plt.scatter(x_data, y_data)
plt.plot(x_data, value, 'r-', lw=5)
plt.show()