TensorFlow 2 实现线性回归

  • 低阶 API 实现

什么是「Eager Execution」,它是一个命令式、由运行定义的接口,一旦从 Python 被调用,其操作立即被执行。
这使得入门 TensorFlow 变的更简单,也使研发更直观。

什么是张量?张量是一个多维数组。每个Tensor都有一个形状和数据类型。print(x.shape) ,print(x.dtype)

下面来展示低阶API实现:

 1 import matplotlib.pyplot as plt
 2 import tensorflow as tf
 3 %matplotlib inline
 4 
 5 TRUE_W = 3.0
 6 TRUE_b = 2.0
 7 NUM_SAMPLES = 100
 8 
 9 # 初始化随机数据,这里随机生成了100行,1列的随机数
10 X = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy()
11 noise = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy()
12 y = X * TRUE_W + TRUE_b + noise  # 添加噪声
13 
14 plt.scatter(X, y)

 

 

 下面是建立模型的部分:

class Model(object):
    def __init__(self):
        self.W = tf.Variable(tf.random.uniform([1]))  # 随机初始化参数
        self.b = tf.Variable(tf.random.uniform([1]))

    def __call__(self, x):
        return self.W * x + self.b  # w*x + b

 

 实例化模型:

实例化就是让编译器按这个参数编译一份可链接的类出来
model = Model()  # 实例化模型

plt.scatter(X, y)
plt.plot(X, model(X), c='r')
reduce_mean这个api是根据给出的axis在input_tensor上求平均值
def loss_fn(model, x, y):
    y_ = model(x)
    return tf.reduce_mean(tf.square(y_ - y))

 

 tf.GradientTape() 以追踪梯度,tape.gradient 计算梯度,assign_sub 即可完成公式中的减法操作以更新梯度

EPOCHS = 10  # 全部数据迭代 10 次,如果拟合条件不好可以增加迭代次数
LEARNING_RATE = 0.1  # 学习率

for epoch in range(EPOCHS):  # 迭代次数
    with tf.GradientTape() as tape:  # 追踪梯度
        loss = loss_fn(model, X, y)  # 计算损失
    dW, db = tape.gradient(loss, [model.W, model.b])  # 计算梯度
    model.W.assign_sub(LEARNING_RATE * dW)  # 更新梯度
    model.b.assign_sub(LEARNING_RATE * db)
    # 输出计算过程
    print(f'Epoch [{epoch}/{EPOCHS}], loss [{loss}], W/b [{model.W.numpy()}/{model.b.numpy()}]')
plt.scatter(X, y)
plt.plot(X, model(X), c='r')

 

posted on 2020-03-28 21:41  蝶影漫舞  阅读(230)  评论(0编辑  收藏  举报