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')