TensorFlow提供了硬件加速运算(GPU 支持)、自动求导、优化器等一系列对深度学习非常重要的功能。下面将展示如何使用TensorFlow 在即时执行模式下计算一元线性回归。
import numpy as np
import tensorflow as tf
import time
X_raw = np.array([2013, 2014, 2015, 2016, 2017], dtype=np.float32)
y_raw = np.array([12000, 14000, 15000, 16500, 17500], dtype=np.float32)
X = (X_raw - X_raw.min()) / (X_raw.max() - X_raw.min())
y = (y_raw - y_raw.min()) / (y_raw.max() - y_raw.min())
# TensorFlow帮助我们做了两件重要的工作:
# (1)使用tape.gradient(ys,xs)自动计算梯度。
# (2)使用optimizer.apply_gradients(grads_and_vars)自动更新模型参数。
X = tf.constant(X)
y = tf.constant(y)
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a, b]
num_epoch = 10000
# 梯度下降优化器:SGD(随机梯度下降)
optimizer = tf.keras.optimizers.SGD(learning_rate=5e-4)
for e in range(num_epoch):
# 使用tf.GradientTape()记录损失函数的梯度信息
with tf.GradientTape() as tape:
y_pred = a * X + b
loss = tf.reduce_sum(tf.square(y_pred - y))
# TensorFlow自动计算损失函数关于自变量(模型参数)的梯度
grads = tape.gradient(loss, variables)
# TensorFlow自动根据梯度更新参数,从而最小化损失函数loss:
# 更新模型参数的方法optimizer.apply_gradients()中需要提供参数grads_and_vars,
# 即待更新的变量(variables)和损失函数关于这些变量的偏导数(grads)。
# 具体而言,这里需要传人一个 Python 列表(list),列表中的每个元素是一个(变量的偏导数,变量)对,
# 比如这里是[(grad_a,a),(grad_b,)]。我们通过grads=tape.gradient(1oss, variables)求出 tape中记录的1oss关于variables=[a,b]中每个变量的偏导数,
# 也就是grads=[grad_a,grad_b],再使用Python 的zip()函数将grads=[grad_a, grad_b]和 variables=[a,b]拼装在一起,就可以组合出所需的参数了。
optimizer.apply_gradients(grads_and_vars=zip(grads, variables))
print(a, b)