我正在使用过时的机器学习教科书(使用Scikit-Learn和Tensorflow进行动手机器学习),因此示例使用的是tf1.0。我试图弄清tf2.0中所有内容的“流”是什么,因为看起来sessions
已经不复存在了?我环顾四周,想出了一种方法:
n_epochs = 1000
learning_rate = 0.11
X = tf.constant(scaled_housing_data_biased, dtype=tf.float32)
y = tf.constant(housing.target.reshape(-1, 1), dtype=tf.float32)
with tf.GradientTape() as tape:
# randomly initialise theta
theta = tf.Variable(tf.random.uniform([n+1, 1]), dtype=tf.float32)
# make a guess
y_pred = tf.linalg.matmul(X, theta)
error = y_pred - y
mse = tf.reduce_mean(tf.square(error))
grads = tape.gradient(mse, theta)
for e in range(n_epochs):
if e % 100 == 0:
print("Epoch #{} w/ MSE {:.3f}".format(e, mse))
with tf.GradientTape() as tape:
theta.assign(theta - learning_rate * grads)
y_pred = tf.linalg.matmul(X, theta)
error = y_pred - y
mse = tf.reduce_mean(tf.square(error))
grads = tape.gradient(mse, theta)
print(theta)
与教科书的简单sess.run(...)
代码相比,这看起来确实很笨拙和凌乱。更多有经验的用户将如何写呢? (是的,我也知道已经有一个优化的GradientDescnetOptimizer
,但这不是重点)