import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
np.random.seed(100)
x = np.linspace(-1, 1, 100).reshape(100, 1)
y = 3 * np.power(x, 2) + 2 + 0.2 * np.random.rand(x.size).reshape(100, 1)
# 初始化参数
# 创建两个占位符,分别用来存放输入数据x和目标值y
# 运行计算图时,导入数据
x1 = tf.placeholder(tf.float32, shape=(None, 1))
y1 = tf.placeholder(tf.float32, shape=(None, 1))
# 创建权重变量w和b,并用随机值初始化
# Tensorflow的变量在整个计算图保存其值
w = tf.Variable(tf.random_uniform([1], 0, 1.0))
b = tf.Variable(tf.zeros([1]))
# 实现前向传播及损失函数
# 前向传播,计算预测值
y_pred = np.power(x, 2) * w + b
# 计算损失值
loss = tf.reduce_mean(tf.square(y - y_pred))
# 计算有关参数w,b关于损失函数的梯度
grad_w, grad_b = tf.gradients(loss, [w, b])
# 用梯度下降法更新参数
# 执行计算图时给new_w1和new_w2赋值
# 对Tensorflow来说,更新参数是计算图的一部分内容
# 而pytorch,这部分属于计算图之外
lr = 0.001 # 学习率
new_w = w.assign(w - lr * grad_w)
new_b = b.assign(b - lr * grad_b)
# 训练模型
# 已构建计算图, 接下来创建Tensorflow session,准备执行计算图
with tf.Session() as sess:
# 执行之前需要初始化变量w,b
sess.run(tf.global_variables_initializer())
for step in range(20000):
# 循环执行计算图,每次需要把x1,y1赋给x,y
# 每次执行计算图时,需要计算关于new_w和new_b的损失值
# 返回numpy数组
loss_value, v_w, v_b = sess.run([loss, new_w, new_b],
feed_dict={x1: x, y1: y})
if step % 200 == 0: # 每200次打印一次训练结果
print("损失值、权重、偏移量分别为{:.4f},{},{}".format(loss_value, v_w, v_b))
# 可视化结果
plt.figure()
plt.scatter(x, y)
plt.plot(x, v_b + v_w * x **2)
plt.show()